fshp, В моем случае есть один подвох и ситуация слегка другая. Ситуация такая: есть либа, которая в себе статически включает либы OpenCV. И есть мое приложение, которое динамически подключает эту либу и динамически подключает OpenCV. Все это на VS 2017.
У меня после генерации проекта получается список:
И если вызывать методы из OpenCV у меня приложение крашится ссылаясь на libWithStaticOpenCv.dll. Если libWithStaticOpenCv.lib перенести ниже списка OpenCV либ, то все нормально. Но это приходится костылить руками, хотелось бы, чтобы в cmake можно было самому указать порядок.
Проблема как то связана с названиями методов, которая генерируется при линковке и их адресами.
П.С. Помню твой ник по хабру, по моему я по твоей статье изучал cmake :)
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 порядок следующий: