【问题标题】:How do I configure cmake to link to prebuilt shared libraries?如何配置 cmake 以链接到预构建的共享库?
【发布时间】:2015-10-06 21:51:05
【问题描述】:

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

我的项目
* CMakeLists.txt
* 源
* 第三方
** CMakeLists.txt
** opencv
**** 包括
****库

我想链接第三方目录中的 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)

【问题讨论】:

  • 如果你使用find_package(OpenCV),那么在它之前使用set(OpenCV_DIR ${CMAKE_SOURCE_DIR}/third_party/opencv)。或者,您可以使用直接路径:include_directories(${CMAKE_SOURCE_DIR}/third_party/opencv/include) 和对应的link_directories(${CMAKE_SOURCE_DIR}/third_party/opencv/lib) 调用。这些标准命令有什么问题?
  • @Tsyvarev 我已经采纳了您的建议并应用了它们(请参阅修改后的问题描述)。不幸的是,我仍然收到链接器错误(ld: symbol(s) not found for architecture x86_64)
  • 请在您的问题中添加链接器的错误消息。你有另一个 OpenCV 库,安装到默认路径中吗?链接器找到了库文件,但没有在其中找到符号,这看起来很奇怪。
  • 错误信息只是一个symbol not found信息,表示我没有链接到库
  • "Symbol(s) not found" 消息表明所有请求的(在target_link_libraries()找到了库,但没有一个定义给定的符号乙>。顺便说一句,此错误可能是由于代码使用的符号名称不正确造成的。

标签: cmake


【解决方案1】:

我已经在具有 XCode 7.0.1 的 OS X 10.11 上尝试了 CMake 3.3.2 的示例。

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

只是一个视图提示,希望可以让您了解为什么它无法在您的 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 
    
  • 您可以尝试提供完整的库路径,因为 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})  
    

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

    ../third_party/opencv/lib/libopencv_calib3d.dylib 
    

其他问答参考

【讨论】:

    猜你喜欢
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 2015-10-03
    • 2015-10-08
    • 2012-09-30
    • 2022-01-23
    相关资源
    最近更新 更多