cmake

2009-06-30 17 views
28

के साथ boost.system के खिलाफ कैसे लिंक करें I C++ फ़ाइल को संकलित करने के लिए एक सेमेक जेनरेट मेकफ़ाइल का उपयोग करें जो बूस्ट फाइल सिस्टम लाइब्रेरी पर निर्भर करता है।cmake

लिंक करने की प्रक्रिया मैं निम्नलिखित त्रुटि मिलती है के दौरान:

 
cd /Users/janusz/Documents/workspace/ImageMarker/Debug/src && /opt/local/bin/cmake -E cmake_link_script CMakeFiles/ImageMarker.dir/link.txt --verbose=1 
/usr/bin/c++ -O3 -Wall -Wno-deprecated -g -verbose -Wl,-search_paths_first -headerpad_max_install_names -fPIC CMakeFiles/ImageMarker.dir/ImageMarker.cpp.o CMakeFiles/ImageMarker.dir/Image.cpp.o CMakeFiles/ImageMarker.dir/utils.cpp.o CMakeFiles/ImageMarker.dir/XMLWriter.cpp.o CMakeFiles/ImageMarker.dir/FaceRecognizer.cpp.o -o ImageMarker -L/opt/local/lib ../libTinyXml.a /opt/local/lib/libboost_filesystem-mt.dylib 

कुछ Googling मुझे पता चला है कि इस त्रुटि को लगता है:

 
Undefined symbols: 
    "boost::system::get_generic_category()", referenced from: 
     __static_initialization_and_destruction_0(int, int)in FaceRecognizer.cpp.o 
     __static_initialization_and_destruction_0(int, int)in FaceRecognizer.cpp.o 
     __static_initialization_and_destruction_0(int, int)in FaceRecognizer.cpp.o 
    "boost::system::get_system_category()", referenced from: 
     __static_initialization_and_destruction_0(int, int)in FaceRecognizer.cpp.o 
     __static_initialization_and_destruction_0(int, int)in FaceRecognizer.cpp.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 
make[2]: *** [src/ImageMarker] Error 1 

makefile कि इस त्रुटि को उत्पन्न करता है से कार्रवाई इस लाइन है बूस्ट फ़ाइल सिस्टम लाइब्रेरी के साथ मैक पर आम हो क्योंकि मुझे boost.system लाइब्रेरी के खिलाफ लिंक करना है या boost.system लाइब्रेरी के आधार पर मेरी प्रोजेक्ट बनाना है।

लाइब्रेरी पथ को हार्डकोड किए बिना लाइब्रेरी के खिलाफ लिंक करने के लिए मैं cmake को कैसे मजबूर करूं?

यहाँ परिणाम otool से:

otool -L /opt/local/lib/libboost_filesystem-mt.dylib 
/opt/local/lib/libboost_filesystem-mt.dylib: 
/opt/local/lib/libboost_filesystem-mt.dylib (compatibility version 0.0.0, current version 0.0.0) 
/opt/local/lib/libboost_system-mt.dylib (compatibility version 0.0.0, current version 0.0.0) 
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.4.0) 
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0) 
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.0.0) 
+0

जनुज़, कृपया "otool -L /opt/local/lib/libboost_filesystem-mt.dylib" करें और हमें परिणाम दें। धन्यवाद। –

उत्तर

60

linux पर CMake ही आंकड़े कि boost_filesystem boost_system के खिलाफ जुड़ा हुआ है। जाहिर है आप मैक पर स्पष्ट रूप से यह कहना है:

find_package(Boost COMPONENTS system filesystem REQUIRED) 
#... 
target_link_libraries(mytarget 
    ${Boost_FILESYSTEM_LIBRARY} 
    ${Boost_SYSTEM_LIBRARY} 
) 
+0

यह विचित्र है। लिनक्स पर, boost.filesystem गतिशील पुस्तकालय boost.system लाइब्रेरी को संदर्भित करता है, इसलिए boost.system के लिए कोई स्पष्ट लिंक आवश्यक नहीं है। कोई विचार यह क्यों नहीं हो रहा है? –

+0

आप कठोर हैं, ldd libboost_filesystem.so सूची libboost_system.so (0x00007fcd31e67000) सूचीबद्ध है। मैक पर AFAIK "otool -L" ldd के बराबर है, लेकिन मेरे पास कोई मैक नहीं है। क्या हमें इसे एमएल को बढ़ावा देना चाहिए? –

+9

इसके बदले $ {Boost_LIBRARIES} का उपयोग करने के बारे में क्या? हमेशा घटक द्वारा निर्दिष्ट सब कुछ शामिल करना चाहिए, नहीं? – LiMuBei

5

इस पोस्ट प्रश्न का "जवाब", लेकिन मेरे Ubuntu बॉक्स पर एक अवलोकन नहीं है।

बूस्ट libs का उपयोग करने के लिए, आप स्पष्ट रूप से कुछ इस तरह लिखने के लिए है:

find_package(Boost COMPONENTS regex system filesystem REQUIRED) 

इसके अलावा, आप इसे इस तरह से जोड़ने के लिए की जरूरत है:

target_link_libraries(binary 
    ${Boost_FILESYSTEM_LIBRARY} 
    ${Boost_SYSTEM_LIBRARY} 
    ${Boost_REGEX_LIBRARY} 
) 

और निम्नलिखित तरीके से नहीं था ' टी काम, कम से कम मेरे लिए:

target_link_libraries(binary regex system filesystem) 

यह मैक कहता है, लेकिन मैक पर ही नहीं।