2015-10-06 95 views
1

我有一个项目,其中包含一个子目录中的opencv的预建版本。例如:如何配置cmake以链接到预构建的共享库?

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) 
+0

如果你使用'find_package(OpenCV的)''然后设置(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

+0

@Tsyvarev我已经采纳了您的建议并将其应用(请参阅推荐的问题描述)。不幸的是,我仍然得到一个链接器错误(ld:symbol(s)not found for architecture x86_64) –

+0

Plesase,将链接器的错误消息添加到您的问题中。你有另一个OpenCV库,安装到默认路径?这看起来很奇怪,链接器找到了库文件,但没有找到它的符号。 – Tsyvarev

回答

3

我已经给你的例子尝试使用CMake 3.3.2在OS X 10.11有XCode 7.0.1。

使用@Tsyvarev建议link_directories()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 
    
  • 您可以尝试提供完整的库路径,因为这些路径是通过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 
    

其他Q/A参考