如何在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的一部分。

我已经尝试过这样的:

  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 *。粗略的报告 你所做的事情太模糊,无法让我们超越猜测。 –

您可以将-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

此外,你也可以考虑的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?

使用otoolfile命令确定您的dylibs为x86_64。例如,尝试像这样的file /usr/local/lib/requiredlib.dylib。如果您没有看到这个输出:

requiredlib.dylib(适用于建筑x86_64的):Mach-O的64位动态链接共享库x86_64的

那么你的问题是不匹配的拱形建筑时库和构建应该使用这些库的代码时。