2015-10-06 70 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參考