2011-09-14 17 views
9

के साथ समस्या को जोड़ना मैं एक प्रोग्राम लिख रहा हूं जो ओपनसीवी (स्थानीय निर्देशिका में स्थापित है, क्योंकि मेरे पास उस मशीन पर रूट अनुमति नहीं है) का उपयोग करता है, और मैंने संबंधित CMakeLists.txt फ़ाइल लिखी है। मेरी समस्या यह है कि संकलन अलग-अलग तरीकों से लिंकिंग चरण में विफल रहता है (मैंने वेब पर प्रस्तावित सभी अलग-अलग समाधानों की कोशिश करने में तीन घंटे बिताए हैं, इसलिए मैंने बहुत सारे परिणाम देखे हैं)। यहाँ आप विन्यास/परिणाम जो मेरे लिए अधिक मायने हैं, भले ही वे एक विफलता के लिए नेतृत्व: [project_root में/CMakeLists.txt]:ओपनसीवी और सीएमके

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) 

... तो यह पुस्तकालय नामों की एक सूची हो जाएगा, और यह ठीक काम करना चाहिए।

सीएमके अपने आदेशों के लिए तर्क अलग करने के लिए स्पेस कैरेक्टर का उपयोग करता है। इसके कारण, सेट कमांड में किसी मान में कोई स्थान शामिल करने के लिए, आपको इसे उद्धृत करना होगा। इस मामले में, आप ऐसा नहीं करना चाहते हैं क्योंकि आप सेट कमांड को आपके द्वारा गुजरने वाले कई मानों को देखने के लिए चाहते हैं, न कि एक बड़ा मान जिसमें रिक्त स्थान हैं।

संपादित करें: (आगे टिप्पणी में चर्चा के आधार पर जानकारी):

यदि इससे भी काम नहीं करता है, दुबारा जाँच करते नाम आप उपयोग कर रहे हैं सही हैं। लाइब्रेरी नामों के साथ आप यहां उपयोग कर रहे हैं, OpenCV_LIBS_DIR चर द्वारा नामित निर्देशिका में libopencv_core.so, libopencv_imgproc.so नामक फाइलें होनी चाहिए। यदि उन सटीक लाइब्रेरी नाम फ़ाइलों के रूप में मौजूद नहीं हैं, तो यह लिंकर त्रुटि बताता है। (इस मामले में, टिप्पणियों में चर्चा के अनुसार, वास्तविक फ़ाइलों को फ़ाइल नामों में संस्करण संख्याओं के साथ नामित किया गया था और उनमें कोई "गैर-संस्करण" सिम्लिंक नहीं था।)

+0

हाय, आपके उत्तर के लिए धन्यवाद, मैं कोशिश की है, लेकिन अभी भी मैं त्रुटि ... – Rob

+0

Hmmmm "-lopencv_core नहीं मिल सकता है" मिलता है ... क्या आप "उपनिर्देशिका" बदलते हैं करने के लिए "add_subdirectory" ? – DLRdave

+0

मैं add_subdirectory के रूप में यह बदल दिया है ( $ {CMAKE_BINARY_DIR} /../ src ) लेकिन अभी भी परिणाम में कोई परिवर्तन नहीं :( – Rob

5

ओपनसीवी को शामिल करने का सही तरीका यहां दिया गया है अपने प्रोजेक्ट में:

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

यह या तो काम नहीं करता है ... :(एक सप्ताह में sysadmins सर्वर पर अपडेट करने जा रहे हैं, जिस पर मैं काम कर रहा हूं, और मुझे आशा है कि चीज में सुधार होगा। धन्यवाद बहुत कुछ! – Rob

+0

आपकी टिप्पणियों से मैं देखता हूं कि आप ओपनसीवी ट्रंक के पुराने संस्करण का उपयोग कर रहे हैं। मुझे सलाह है कि आप आधिकारिक रिलीज में से किसी एक का उपयोग करें या नवीनतम संशोधन में अपग्रेड करें। 2.2.9 से अधिक 200 बग तय किए गए हैं (कई इंस्टॉलेशन बग सहित) –

+0

मुझे पता है, लेकिन धन्यवाद इसे इंगित करना। मैं पुराने ओपनसीवी संस्करण का उपयोग कर रहा हूं क्योंकि मेरे पास सर्वर पर रूट रूट नहीं है, और जब मैं व्यवस्थापक को CUDA4.0 इंस्टॉल करने का इंतजार कर रहा हूं, तो मैं कुछ कोड जांचना चाहता था ... – Rob

0

समस्या हो सकती है कि लिंकर libopencv_core.so नाम की एक फ़ाइल के लिए लग रही है लेकिन वहाँ उस मामले सांकेतिक लिंक का उपयोग करने की जरूरत है एक समान नाम libopencv_core.so.1 के साथ एक फ़ाइल है। उदाहरण के लिए ऐसा करते हैं ln -sf /opt/lib/libopencv_core.so.1 /opt/lib/libopencv_core.so