如何在shell中编译在macOS Sierra上使用dylib路径的源码
我正在编译一些源代码,这些源代码需要我已经构建的其他项目中的一些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的一部分。
我已经尝试过这样的:
- 执行
install_name_tool -id "@/usr/local/lib/requiredlib.dylib" /usr/local/lib/requiredlib.dylib
- 添加
-L/usr/local/lib
的编译选项。 - 将所有的dylib路径显式添加到编译选项中。
- 尝试添加
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
文件列表。
您可以将-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
查看与您的可执行文件链接的所有库。
请参阅手册页ld
和install_name_tool
以获取有关rpath的更多信息。 install_name_tool
也可以添加更多的路径和-add_rpath
。
此外,你也可以考虑的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
。
看起来你是bulding x86_64的例子,你是否检查你安装的.dylibs是否也是x86_64?
使用otool
或file
命令确定您的dylibs为x86_64
。例如,尝试像这样的file /usr/local/lib/requiredlib.dylib
。如果您没有看到这个输出:
requiredlib.dylib(适用于建筑x86_64的):Mach-O的64位动态链接共享库x86_64的
那么你的问题是不匹配的拱形建筑时库和构建应该使用这些库的代码时。
你不知道你错过了什么符号,你正在运行什么样的g ++变体等等。当然你编译的库不会安装在'/ usr/local/include'中。 – pvg
编辑你的问题以添加这些细节。 – pvg
要获得失败链接的帮助,您需要至少发布失败的 链接命令行及其输出* verbatim *。粗略的报告 你所做的事情太模糊,无法让我们超越猜测。 –