2012-09-20 19 views
16

हैलो मैं थ्रेडिंग लाइब्रेरी का उपयोग करने के लिए बढ़ावा देने के साथ लिंक करने का प्रयास कर रहा हूं, लेकिन इसे बनाने के लिए प्रतीत नहीं होता है।बूस्ट के साथ लिंक (होमब्रू) मैक सी ++

मैंने होमब्रू (मैक पैकेज इंस्टॉलर) के साथ बढ़ावा स्थापित किया है और यह /usr/local/Cellar/boost/1.50.0 निर्देशिका में है।

मेरा मुख्य फ़ाइल अभी बहुत सरल है ...

#include <iostream> 
#include <boost/thread.hpp> 

मेरे मेकअप फ़ाइल इस तरह है:

CC = g++ 


BASE_FLAGS = -m32 -wAll 

# INCLUDE BASE DIRECTORY AND BOOST DIRECTORY FOR HEADERS 
LDFLAGS = -I/usr/local/Cellar/boost/1.50.0/include -I/opt/local/include 

# INCLUDE BASE DIRECTORY AND BOOST DIRECTORY FOR LIB FILES 
LLIBFLAGS = -L/usr/local/Cellar/boost/1.50.0/ 

# SPECIFIY LINK OPTIONS 
LINKFLAGS = -l boost_thread-mt -lboost_system 

# FINAL FLAGS -- TO BE USED THROUGHOUT 
FLAGS = $(BASE_FLAGS) $(LLIBFLAGS) $(LDFLAGS) $(LINKFLAGS) 




# NOTE FOR BOOST -- YOU ONLY NEED TO INCLUDE THE PATH BECAUSE IT ONLY INSTALLS HEADER FILES 
main: main.cpp 
    $(CC) $(FLAGS) -o main.out main.cpp 

और जब मैं इस चलाने के लिए, मैं एक पुस्तकालय मिल boost_system के लिए नहीं मिला । अगर मैं boost_system बाहर ले, तो मैं एक त्रुटि है कि इस तरह दिखता है मिलती है:

ld: warning: ignoring file /usr/local/lib/libboost_thread-mt.dylib, file was built for unsupported file format (0xcf 0xfa 0xed 0xfe 0x 7 0x 0 0x 0 0x 1 0x 3 0x 0 0x 0 0x 0 0x 6 0x 0 0x 0 0x 0) which is not the architecture being linked (i386): /usr/local/lib/libboost_thread-mt.dylib 
Undefined symbols for architecture i386: 
    "boost::system::system_category()", referenced from: 
     __static_initialization_and_destruction_0(int, int)in ccKwJWzr.o 
    "boost::system::generic_category()", referenced from: 
     __static_initialization_and_destruction_0(int, int)in ccKwJWzr.o 
ld: symbol(s) not found for architecture i386 
collect2: ld returned 1 exit status 
make: *** [main] Error 1 
+0

क्यों तुम्हारे बिना '-mt' प्रत्यय और एक के साथ एक फ़ाइल लिंक कर रहे हैं? '-lboost_thread -lboost_system' या' -lboost_thread-mt -lboost_system-mt' –

+0

हैलो, जब मैं सिर्फ -lboost_thread से लिंक करता हूं तो यह मुझे ld 'ld की त्रुटि देता है: लाइब्रेरी_थ्रेड संग्रह 2 के लिए लाइब्रेरी नहीं मिली: ld 1 लौटा बाहर निकलें स्थिति ' – JonMorehouse

+1

क्या होता है जब आप दोनों को' -mt' जोड़ते हैं? –

उत्तर

16

तुम सिर्फ कोई विकल्प के साथ प्रयोग किया है, तो brew install boost, इस बनाता है एक 64-बिट द्विआधारी - दोनों स्थिर और गतिशील।

उपरोक्त कोड से आपका मुख्य अपराधी -m32 विकल्प का उपयोग है, इसे हटाएं और आपको ठीक होना चाहिए। इसका मतलब है कि आप 64-बिट लाइब्रेरी के खिलाफ 32-बिट बिल्ड को लिंक करने का प्रयास कर रहे हैं।

बूस्ट पुस्तकालय वास्तविक बाइनरी और शीर्षलेखों से /usr/local/Cellar/ - (/usr/local/lib और /usr/local/include) में प्रतीकात्मक रूप से जुड़े हुए हैं। आपके पथ में इन्हें शामिल करना चाहिए, इसलिए इन्हें आपके मेकफ़ाइल में निर्दिष्ट करने की आवश्यकता नहीं है।

ध्यान दें कि ब्रू (एक्सटेंशन जीसीसी द्वारा) आम तौर पर डिफ़ॉल्ट रूप से 64-बिट बाइनरी बनाता है, जो आपके त्रुटि आउटपुट से बूस्ट पुस्तकालयों पर बनाया गया है। (आप देख सकते हैं कि वास्तुकला एक पुस्तकालय इन उपकरणों otool, file या lipo का उपयोग करना है) जेसी अच्छा ने संकेत के रूप में आप -mt प्रत्यय के साथ एक समस्या है

+4

क्या होगा यदि वह * 32-बिट के लिए बनाना चाहता है? – inetknght

+0

मुझे खेद है, मुझे बढ़ावा की स्थापना के साथ कुछ समस्याएं आ रही हैं। जब मैं ब्रू के साथ बूस्ट स्थापित करता हूं तो यह/usr/local/include में कोई भी "प्रतीकात्मक लिंक" नहीं बनाता है, और यदि मैं एक्सकोड प्रोजेक्ट में लाइब्रेरी को शामिल करने का प्रयास करता हूं तो इसे लाइब्रेरी नहीं मिलती है, मैं इसे कैसे ठीक कर सकता हूं ? –

8

। इस में फिर से चलने के लिए (यहां तक ​​कि विंडोज़ पर):

यह पता चला है कि -एमटी प्रत्यय (बहु-थ्रेड समर्थन के लिए खड़े) का उपयोग लिनक्स बूस्ट इंस्टॉलेशन में नहीं बल्कि मैक और अन्य पर किया जाता है। लिनक्स पर बूस्ट अभी भी बहु-थ्रेड समर्थित है, यह सिर्फ एक नामकरण सम्मेलन है। इसके लिए https://stackoverflow.com/a/2310892 भी देखें।

यही कारण है कि आपको मैक और विंडोज पर लिंक विकल्पों में अपने सभी बूस्ट libs में -mt प्रत्यय जोड़ना है, लेकिन लिनक्स पर नहीं। आप लिनक्स सह डेवलपर्स के साथ CMake उपयोग कर रहे हैं (जैसे मैं करता हूँ) आप CMakeLists.txt इस तरह संशोधित कर सकते हैं:

if(APPLE OR WIN32) 
    target_link_libraries([other libs..] boost_thread-mt boost_system-mt) 
else() 
    target_link_libraries([other libs..] boost_thread boost_system) 
endif() 
+0

दरअसल, बूस्ट आम तौर पर मैक ओएस एक्स (दोनों के साथ एक और बिना मल्टीथ्रेडिंग) पर दोनों संस्करणों का निर्माण करता है। यह ** सिर्फ ** नामकरण सम्मेलन नहीं है और आप 'होमब्री' में '-without-single' के साथ एकल-थ्रेडिंग संस्करण को स्पष्ट रूप से अक्षम कर सकते हैं। हालांकि, ऐसा लगता है कि 'बूस्ट_थ्रेड' के लिए कोई भी थ्रेडेड संस्करण नहीं है। – Chris