• Как указать порядок линковки CMake?

    @saracen Автор вопроса
    fshp, Вообще я бы не запаривался, если бы не библиотека, в которой не скрыли символы. Есть сторонняя либа, у которой наружу нескрытыми торчат символы opencv, которая к ней подключена статически (да, сделано не очень, но мне некуда деться). OpenCV использую и я в своем приложении, линкуя динамически. Поэтому мне важен порядок линковки, чтобы OpenCV полностью стоял раньше либы.

    Порядок в CMakeLists.txt таков, что сначала я хочу OpenCV, а потом поключить dll.
    # ---[ Dependencies
    # OS presets
    if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
      set (CMAKE_FIND_LIBRARY_PREFIXES "")
      set (CMAKE_FIND_LIBRARY_SUFFIXES ".lib" ".dll")
    endif ()
    
    # OpenCV
    find_package (OpenCV 3.4 REQUIRED COMPONENTS
      core
      videoio
      imgproc
      highgui
      PATHS "C:/tools/opencv-3.4.3_vc15_x64"
    )
    list (APPEND PROJECT_LINK_LIBRARIES ${OpenCV_LIBS})
    list (APPEND PROJECT_INCLUDE_DIRECTORIES ${OpenCV_INCLUDE_DIRS})
    
    # OS dependent
    if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
      # VMX Capture
      set (VMX_CAPTURE_DIR "C:/tools/vmx_capture-rev1019")
      find_library (VMX_CAPTURE_LIB
        NAMES "GetFrame.lib"
        PATHS "${VMX_CAPTURE_DIR}/lib"
        NO_DEFAULT_PATH
      )
      list (APPEND PROJECT_LINK_LIBRARIES ${VMX_CAPTURE_LIB})
      list (APPEND PROJECT_INCLUDE_DIRECTORIES "${VMX_CAPTURE_DIR}/include")
    endif ()


    Но после генерации списка у меня в Visual Studio порядок следующий:
    C:\tools\opencv-3.4.3_vc15_x64\x64\vc15\lib\opencv_highgui343.lib
    C:\tools\vmx_capture-rev1019\lib\GetFrame.lib
    C:\tools\opencv-3.4.3_vc15_x64\x64\vc15\lib\opencv_videoio343.lib
    C:\tools\opencv-3.4.3_vc15_x64\x64\vc15\lib\opencv_imgcodecs343.lib
    C:\tools\opencv-3.4.3_vc15_x64\x64\vc15\lib\opencv_imgproc343.lib
    C:\tools\opencv-3.4.3_vc15_x64\x64\vc15\lib\opencv_core343.lib


    Мне нужно, чтобы после генерации было так:
    C:\tools\opencv-3.4.3_vc15_x64\x64\vc15\lib\opencv_highgui343.lib
    C:\tools\opencv-3.4.3_vc15_x64\x64\vc15\lib\opencv_videoio343.lib
    C:\tools\opencv-3.4.3_vc15_x64\x64\vc15\lib\opencv_imgcodecs343.lib
    C:\tools\opencv-3.4.3_vc15_x64\x64\vc15\lib\opencv_imgproc343.lib
    C:\tools\opencv-3.4.3_vc15_x64\x64\vc15\lib\opencv_core343.lib
    C:\tools\vmx_capture-rev1019\lib\GetFrame.lib
  • Как указать порядок линковки CMake?

    @saracen Автор вопроса
    fshp, В моем случае есть один подвох и ситуация слегка другая. Ситуация такая: есть либа, которая в себе статически включает либы OpenCV. И есть мое приложение, которое динамически подключает эту либу и динамически подключает OpenCV. Все это на VS 2017.
    У меня после генерации проекта получается список:

    libWithStaticOpenCv.lib
    opencv_core.lib
    opencv_highgui.lib


    И если вызывать методы из OpenCV у меня приложение крашится ссылаясь на libWithStaticOpenCv.dll. Если libWithStaticOpenCv.lib перенести ниже списка OpenCV либ, то все нормально. Но это приходится костылить руками, хотелось бы, чтобы в cmake можно было самому указать порядок.
    Проблема как то связана с названиями методов, которая генерируется при линковке и их адресами.

    П.С. Помню твой ник по хабру, по моему я по твоей статье изучал cmake :)