如何配置cmake链接到预构建的共享库?

MM.*_*MM. 3 cmake

我有一个项目,在子目录中包含opencv的预构建版本。例如:

MyProject
* CMakeLists.txt
* src
* third_party
** CMakeLists.txt
** opencv
****包括
**** lib

我想链接到位于third_party目录中的opencv版本。我的问题是,如何通知CMake链接到lib中的预构建dylib文件,并将标头包含在相关的opencv目录中?

cmake_minimum_required(VERSION 2.8.9)
project (myproject)

include_directories(${CMAKE_SOURCE_DIR}/third_party/opencv/include)
link_directories(${CMAKE_SOURCE_DIR}/third_party/opencv/lib)

file(GLOB SOURCES "*.cpp")

add_executable(myproject ${SOURCES})
target_link_libraries(myproject opencv_calib3d opencv_contrib opencv_core opencv_highgui opencv_features2d opencv_highgui opencv_imgproc)
Run Code Online (Sandbox Code Playgroud)

Flo*_*ian 5

我已经给您的示例尝试了在OS X 10.11上使用XCode 7.0.1的CMake 3.3.2。

使用@Tsyvarev建议的link_directories()and target_link_libraries()方法似乎可以在不引发任何链接程序警告或错误的情况下工作(它会找到.dylib我放置在third_party目录中的库)。

只是一个视图提示,希望可以让您了解为什么它在Mac上不起作用。

  • 使用您的代码,我得到以下命令行链接器文件(在CMake的二进制输出目录中):

    CMakeFiles / myproject.dir / src / link.txt

    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++    
    -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk 
    -Wl,-search_paths_first 
    -Wl,-headerpad_max_install_names  
    CMakeFiles/myproject.dir/src/main.cpp.o  -o myproject  
    -L[...CMAKE_SOURCE_DIR...]/third_party/opencv/lib  
    -lopencv_calib3d -lopencv_contrib -lopencv_core -lopencv_highgui -lopencv_features2d -lopencv_highgui -lopencv_imgproc -lopencv_features2d -lopencv_imgproc 
    -Wl,-rpath,[...CMAKE_SOURCE_DIR...]/third_party/opencv/lib 
    
    Run Code Online (Sandbox Code Playgroud)
  • 您可以尝试提供完整的库路径,因为CMake本身还会另外检查这些库路径,因此我可以很清楚地找到所链接的内容。这是您的示例的修改后的版本:

    CMakeLists.txt

    cmake_minimum_required(VERSION 2.8.9)
    project (myproject)
    
    include_directories(${CMAKE_SOURCE_DIR}/third_party/opencv/include)
    
    file(GLOB SOURCES "src/*.cpp")
    file(GLOB LIBRARIES "third_party/opencv/lib/*.dylib")
    message("LIBRARIES = ${LIBRARIES}")
    
    add_executable(myproject ${SOURCES})
    target_link_libraries(myproject ${LIBRARIES})  
    
    Run Code Online (Sandbox Code Playgroud)

    使用此CMake,只需将完全限定的路径(相对于我的二进制输出目录)添加到链接器文件中即可。在-L-l选项都消失了,你会得到“线”,如:

    ../third_party/opencv/lib/libopencv_calib3d.dylib 
    
    Run Code Online (Sandbox Code Playgroud)

其他问答参考