c++ - Cmake के साथ boost.system के खिलाफ कैसे लिंक करें




macos linker (2)

यह पोस्ट किए गए प्रश्न का "उत्तर" नहीं है, लेकिन मेरे उबंटू बॉक्स पर एक अवलोकन है।

बूस्ट 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)

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

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

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

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

मेकफ़ाइल की क्रिया जो इस त्रुटि को उत्पन्न करती है वह यह पंक्ति है:

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 मुझे दिखाया कि यह त्रुटि बूस्ट फ़ाइल सिस्टम लाइब्रेरी के साथ मैक पर आम लगता है क्योंकि मुझे boost.system लाइब्रेरी के खिलाफ लिंक करना है या boost.system लाइब्रेरी के आधार पर मेरी प्रोजेक्ट बनाना है।

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

ओटोल से परिणाम यहां:

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)

लिनक्स सीएमके पर खुद को आंकड़े बताते हैं कि boost_filesystem boost_system के खिलाफ जुड़ा हुआ है। जाहिर है आपको इसे मैक पर स्पष्ट रूप से बताना होगा:

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