2017-05-04 10 views
10

से मैकोज सिएरा पर डाइलिब पथ का उपयोग करने वाले स्रोत को संकलित करने के लिए कैसे मैं कुछ स्रोत कोड संकलित कर रहा हूं जिसके लिए मैंने पहले से ही बनाई गई अन्य परियोजनाओं से कुछ dylibs की आवश्यकता है। मैं हो रही हैशैल

ld: प्रतीक (रों) वास्तुकला x86_64`

जब भी मैं निष्पादित

g++ some_code.cpp -I/usr/local/include -o executable_binary 

मुझे पता है कि g++ संकलित ढूँढने में सक्षम नहीं है के लिए नहीं मिला dylibs (/usr/local/include पर स्थापित) क्योंकि त्रुटि में कई विशिष्ट प्रतीक भी शामिल हैं जो डाइलीब का हिस्सा हैं।

मैं पहले से ही इस की कोशिश की है:

  1. निष्पादित install_name_tool -id "@/usr/local/lib/requiredlib.dylib" /usr/local/lib/requiredlib.dylib
  2. संकलन विकल्प के लिए -L/usr/local/lib जोड़ा जा रहा है।
  3. सभी डिलीब पथ को संकलन विकल्पों में स्पष्ट रूप से जोड़ना।
  4. DYLD_LIBRARY_PATH असफल रूप से जोड़ने का प्रयास करें क्योंकि सिएरा सुरक्षा कारणों से उस चर को सेट करने की अनुमति नहीं देता है।

मुझे पता है कि DYLD_LIBRARY_PATH जोड़ना संभव हो सकता है लेकिन इसके लिए एसआईपी को अक्षम करने की आवश्यकता है। मैं यह कर सकता हूं कि मैं ऐसा नहीं करना चाहता हूं कि ऐसा करने के लिए एक क्लीनर तरीका है।

पीएस .: मैं Tulip graph library के लिए ट्यूटोरियल उदाहरण संकलित करने की कोशिश कर रहा हूं।

गायब प्रतीकों को मैंने स्थापित ग्राफ लाइब्रेरी से संबंधित हैं। त्रुटि संदेश है:

Undefined symbols for architecture x86_64: 
    "tlp::saveGraph(tlp::Graph*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, tlp::PluginProgress*)", referenced from: 
     _main in tutorial001-02ee7e.o 
    "operator<<(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, tlp::Graph const*)", referenced from: 
     _main in tutorial001-02ee7e.o 
ld: symbol(s) not found for architecture x86_64 

जब भी मैं ls /usr/local/lib/requiredlib.dylib कर सभी Tulip से संकलित पुस्तकालयों देखते हैं।

g++ -v पैदा करता है:

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 
Apple LLVM version 8.1.0 (clang-802.0.42) 
Target: x86_64-apple-darwin16.5.0 
Thread model: posix 
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin 

ls /usr/local/include/tulip/ करने के बाद मैं पुस्तकालयों मैं उपयोग करना चाहते हैं की *.h फ़ाइलों की सूची मिलता है।

+0

यह वास्तव में स्पष्ट नहीं है कि आप कौन से प्रतीकों को याद कर रहे हैं, जी ++ का क्या संस्करण चल रहा है, आदि। और निश्चित रूप से आपके संकलित पुस्तकालय '/ usr/local/include' – pvg

+1

में स्थापित नहीं हैं इन विवरणों को जोड़ने के लिए अपना प्रश्न संपादित करें । – pvg

+0

असफल लिंक के साथ सहायता प्राप्त करने के लिए आपको कम से कम असफल लिंकेज कमांडलाइन और उसके आउटपुट, * verbatim * पोस्ट करने की आवश्यकता है। की स्केची रिपोर्ट्स ने जो किया है, वह हमें अनुमान लगाने से परे लाने के लिए बहुत अस्पष्ट है। –

उत्तर

2

आप लाइब्रेरी खोजने के लिए -rpath सेट कर सकते हैं। अपनी बाइनरी को जोड़ने के बाद आपको lib के खोज पथ को संशोधित करना होगा, ई। ग्राम .:

g++ some_code.cpp -I/usr/local/include -o binary \ 
    -L/usr/local/lib -lrequiredlib -Wl,-rpath,/usr/local/lib 
install_name_tool -change /usr/local/lib/librequiredlib.dylib \ 
    '@rpath/librequiredlib.dylib' binary 

install_name_tool आदेश द्विआधारी ऐसे में पुस्तकालय का नाम बदलता है कि lib rpath में खोज की जाएगी। यदि आप सही नाम के बारे में अनिश्चित हैं, तो अपने निष्पादन योग्य से जुड़े सभी पुस्तकालयों को देखने के लिए otool -L binary का उपयोग करें।

rpath के बारे में अधिक जानकारी प्राप्त करने के लिए ld और install_name_tool का मैन पेज देखें। install_name_tool-add_rpath के साथ-साथ और अधिक rpaths जोड़ सकते हैं।

4

इसके अलावा, आप भी ld

की undefined विकल्प पर गौर कर सकता है निर्दिष्ट करता है कि अपरिभाषित प्रतीकों इलाज किया जाना है। विकल्प हैं: त्रुटि, चेतावनी, दबाने, या dynamic_lookup। डिफ़ॉल्ट त्रुटि है।

कि आप अपनी बाइनरी संकलित करते समय -Wl,-undefined,dynamic_lookup जैसे कॉल करेंगे।

आप -lazy-lx या -lazy-library path का लाभ भी उठा सकते हैं ताकि लाइब्रेरी लोड नहीं हो जाती है जब तक कि इसमें पहले फ़ंक्शन को कॉल नहीं किया जाता है, जो कुछ मामलों में मदद कर सकता है।

फिर install_name_tool जैसे नाम @macmoonshine के साथ नाम बदलने के बाद, rpath ध्वज भी जोड़ें, लेकिन सही पथ को इंगित करना सुनिश्चित करें। डिफ़ॉल्ट रूप से ट्यूलिप डिफ़ॉल्ट लाइब्रेरी फ़ोल्डर /usr/local में स्थापित है, लेकिन इसे उपयोगकर्ता प्रबंधित निर्देशिका में करने के लिए इंस्टॉल मार्गदर्शिका में अनुशंसा की जाती है।

ट्यूलिप द्वारा आवश्यक सभी पुस्तकालयों के लिए निम्न आदेश की तरह कुछ।

install_name_tool -change ./build-release/lib/libtulip-core-4.11.dylib '@rpath/libtulip-core-4.11.dylib' tutorial001 

और ट्यूटोरियल संकलित करते समय -Wl,-rpath,./build-release/lib का भी उपयोग करें।

0

ऐसा लगता है कि आप x86_64 उदाहरणों को बल्ब कर रहे हैं, क्या आपने जांच की है कि आपके इंस्टॉल किए गए। Dylibs x86_64 भी हैं?

otool या file कमांड का उपयोग यह निर्धारित करने के लिए करें कि आपके डाइलीब x86_64 हैं। उदाहरण के लिए, इस file /usr/local/lib/requiredlib.dylib की तरह कुछ कोशिश करें। (वास्तुकला x86_64 के लिए)

requiredlib.dylib: आप उत्पादन में इस दिखाई नहीं देता तो मच-ओ 64-बिट गतिशील रूप से जुड़े हुए शेयर की गई लाइब्रेरी x86_64

तो आपकी समस्या को जब निर्माण बेमेल मेहराब है libs और जब कोड बनाते हैं जो इन libs का उपयोग करना चाहिए।