2011-09-14 152 views
9

我正在寫一個使用OpenCV的程序(安裝在本地目錄中,因爲我沒有該機器上的root權限),並且我寫了相應的CMakeLists.txt文件。我的問題是編譯在鏈接階段以不同的方式失敗(我花了三個小時嘗試網絡上提出的所有不同的解決方案,所以我看到了很多結果)。 給你的配置/結果這使我更有意義,即使它們導致了失敗: [在project_root /的CMakeLists.txt]:OpenCV和CMake鏈接問題

cmake_minimum_required(VERSION 2.8) 
project(CUDA_learning) 

set(OpenCV_INCLUDE_DIR "path/to/opencv_CUDA/include") 
include_directories(${OpenCV_INCLUDE_DIR}) 
set(OpenCV_LIBS_DIR "path/to/opencv_CUDA/lib") 
link_directories(${OpenCV_LIBS_DIR}) 
set(OpenCV_LIBS "opencv_core opencv_imgproc opencv_calib3d opencv_video opencv_features2d opencv_ml opencv_highgui opencv_objdetect opencv_contrib opencv_legacy opencv_gpu") 

find_package(Boost COMPONENTS system filesystem program_options regex REQUIRED) 
if(Boost_FOUND) 
    include_directories(${Boost_INCLUDE_DIR}) 
else(Boost_FOUND) 
    message(FATAL_ERROR "Cannot build application without Boost. Please set Boost_INCLUDE_DIR.") 
endif(Boost_FOUND) 

set(CMAKE_BUILD_TYPE debug) 

add_definitions("-Wall") 

set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/../bin) 

subdirs (
    ../src 
) 

[中project_root/src目錄/的CMakeLists.txt] :

FILE(GLOB dir_source *.cc 2D/*.cc) 
FILE(GLOB dir_header *.hh 2D/*.hh) 

add_executable(${PROJECT_NAME} ${dir_source} ${dir_header}) 
target_link_libraries(${PROJECT_NAME} ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_FILESYSTEM_LIBRARY} ${Boost_SYSTEM_LIBRARY} ${OpenCV_LIBS}) 

結果:

Linking CXX executable ../../bin/CUDA_learning 
c++: opencv_imgproc: No such file or directory 
c++: opencv_calib3d: No such file or directory 
c++: opencv_video: No such file or directory 
c++: opencv_features2d: No such file or directory 
c++: opencv_ml: No such file or directory 
c++: opencv_highgui: No such file or directory 
c++: opencv_objdetect: No such file or directory 
c++: opencv_contrib: No such file or directory 
c++: opencv_legacy: No such file or directory 
c++: opencv_gpu: No such file or directory 

如果相反,在網絡上給出的建議,我把 「-l」 OpenCV庫的名字,我之前得到:

Linking CXX executable ../../bin/CUDA_learning 
/usr/bin/ld: cannot find -lopencv_core 
collect2: ld returned 1 exit status 
make[2]: *** [../bin/CUDA_learning] Error 1 
make[1]: *** [src/CMakeFiles/CUDA_learning.dir/all] Error 2 
make: *** [all] Error 2 

有沒有人知道如何解決這件事?我從字面上瘋狂在這... 非常感謝提前! 乾杯, 羅布

回答

5

這條線:

set(OpenCV_LIBS "opencv_core opencv_imgproc opencv_calib3d opencv_video opencv_features2d opencv_ml opencv_highgui opencv_objdetect opencv_contrib opencv_legacy opencv_gpu") 

...說你已經在用大量的空格的巨大名字OpenCV_LIBS變量一個庫。如果你刪除雙引號,像這樣:

set(OpenCV_LIBS opencv_core opencv_imgproc opencv_calib3d opencv_video opencv_features2d opencv_ml opencv_highgui opencv_objdetect opencv_contrib opencv_legacy opencv_gpu) 

...那麼它將是一個庫名稱列表,它應該工作得很好。

CMake使用空格字符將參數分隔到其命令中。因此,要在set命令的值中包含空格,必須將其雙引號。在這種情況下,您不希望這樣做,因爲您希望set命令查看傳入的多個值,而不是包含空格的大值。

編輯:(根據討論的意見進一步的信息):

如果這仍然不起作用,仔細檢查您所使用的名稱是正確的。使用您在此處使用的庫名稱時,應該在由OpenCV_LIBS_DIR變量命名的目錄中存在名爲libopencv_core.so,libopencv_imgproc.so等的文件。如果那些確切的庫名稱不作爲文件存在,那麼解釋鏈接器錯誤。 (在這種情況下,正如評論中所討論的那樣,實際文件在文件名中使用版本號命名,並且沒有指向它們的「非版本化」符號鏈接。)

+0

嗨,感謝您的回答,我已經嘗試過,但仍然得到「無法找到-lopencv_core」錯誤... – Rob

+0

嗯......如果將「subdirs」更改爲「add_subdirectory」 ? – DLRdave

+0

我已經改變了它作爲 add_subdirectory( $ {} CMAKE_BINARY_DIR /../ SRC ) 但還是在結果沒有變化:( – Rob

5

這裏是正確的方式來包含OpenCV到項目:

set(OpenCV_DIR "path/to/opencv_CUDA/share/OpenCV" 
    CACHE PATH "The path where OpenCVConfig.cmake is placed") 
find_package(OpenCV REQUIRED) 

# and for each executable/library dependent on OpenCV 
TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${OpenCV_LIBS}) 
+1

它不工作...... :(在一個星期系統管理員將要做的更新我正在工作的服務器,我希望事情會改善然後,非常感謝! – Rob

+0

從您的意見,我看到你使用的是舊版本的OpenCV主幹,我推薦你使用其中一個官方版本或者升級到最新版本,自從2.2.9以來有超過200個的bug被修復(包括幾個安裝bug) –

+0

我知道,但是謝謝我正在使用一箇舊的OpenCV版本,因爲我在服務器上沒有root訪問權限,而當我在等待管理員安裝CUDA4.0時,我想測試一些代碼。 – Rob

0

的問題可能是,鏈接器正在尋找一個名爲libopencv_core.so文件,但有一個與你需要使用符號鏈接這種情況下,類似的名稱libopencv_core.so.1文件。例如這樣做ln -sf /opt/lib/libopencv_core.so.1 /opt/lib/libopencv_core.so