2017-05-04 106 views
10

我正在編譯一些源代碼,這些源代碼需要我已經構建的其他項目中的一些dylib。我越來越如何在shell中編譯在macOS Sierra上使用dylib路徑的源碼

LD:符號(S)未找到架構x86_64`

每當我執行

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

我知道g++無法找到編譯dylibs(安裝在/usr/local/include),因爲該錯誤還提到了很多特定的符號是dylib的一部分。

我已經嘗試過這樣的:

  1. 執行install_name_tool -id "@/usr/local/lib/requiredlib.dylib" /usr/local/lib/requiredlib.dylib
  2. 添加-L/usr/local/lib的編譯選項。
  3. 將所有的dylib路徑顯式添加到編譯選項中。
  4. 嘗試添加DYLD_LIBRARY_PATH失敗,因爲Sierra出於安全原因不允許設置該變量。

我知道它可能會添加DYLD_LIBRARY_PATH但需要禁用SIP。我可以做到這一點,我不想如果有更乾淨的方式來做到這一點。

P.S .:我想編譯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所有從鬱金香的編譯庫的存在。

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

你不知道你錯過了什麼符號,你正在運行什麼樣的g ++變體等等。當然你編譯的庫不會安裝在'/ 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查看與您的可執行文件鏈接的所有庫。

請參閱手冊頁ldinstall_name_tool以獲取有關rpath的更多信息。 install_name_tool也可以添加更多的路徑和-add_rpath

4

此外,你也可以考慮的ld

undefined選項指定符號如何未定義的來對待。選項有:error,warning,suppress或dynamic_lookup。默認值是錯誤。

那你會打電話像-Wl,-undefined,dynamic_lookup在編譯的二進制文件。

您還可以利用-lazy-lx-lazy-library path,以便在調用庫中的第一個函數之前不加載庫,這可能有助於某些情況。

然後添加rpath標誌,在用@macmoonshine顯示的install_name_tool更改名稱後,請確保指向正確的路徑。默認情況下,鬱金香安裝在默認庫文件夾/usr/local中,但在安裝指南中建議您在用戶管理的目錄中執行此操作。

對於tulip所需的所有庫,如下所示。

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

看起來你是bulding x86_64的例子,你是否檢查你安裝的.dylibs是否也是x86_64?

使用otoolfile命令確定您的dylibs爲x86_64。例如,嘗試像這樣的file /usr/local/lib/requiredlib.dylib。如果您沒有看到這個輸出:

requiredlib.dylib(適用於建築x86_64的):Mach-O的64位動態鏈接共享庫x86_64的

那麼你的問題是不匹配的拱形建築時庫和構建應該使用這些庫的代碼時。