c++ - @executable_path 不工作

标签 c++ macos linker dynamic-library

我已经安装了 SDL2。我可以将我的程序链接到

clang++ -lSDL2 -lv8 main.o test.o -o nano8

但是,出于分发的原因,我想将 SDL2 与二进制文件一起赠送,因此我将 libSDL2-2.0.0.dylib 复制到/myapp/lib/libSDL2-2.0.0.dylib 下 至于文档,@executable_path 应该允许我链接到那个 dylib 而不是/usr/local/lib 中的那个,但是如果我运行

clang++ @executable_path/lib/libSDL2-2.0.0.dylib -lv8 main.o test.o -o nano8

我得到了错误

clang: error: no such file or directory: '@executable_path/lib/libSDL2-2.0.0.dylib'

如何设置动态库的搜索路径?

最佳答案

做对是一件痛苦的事。

我假设 /myapp 可以在文件系统中的任何位置,并且想从 @executable_path/../lib/libSDL2.dylib 加载库?

如果是这样,您必须使用运行路径并在链接期间复制和修改库(这需要在每次构建时完成):

  1. cp/usr/local/lib/libSDL2.dylib build_dir/lib
  2. 使用 install_name_tool 更改 .dylib安装名称:

    install_name_tool -change /usr/local/lib/libSDL2.dylib @rpath/libSDL2.dylib build_dir/lib/libSDL2.dylib
    
  3. 链接到 build_dir/lib/libSDL2.dylib 并在链接期间设置 rpath:

    cd build_dir/bin
    clang++ obj_dir/main.o obj_dir/test.o -o nano8 -L ../lib -lv8 -lSDL2 -Xlinker -rpath -Xlinker "@executable_path/../lib"
    

我没有测试过这个,可能有错误。使用 otool -L 检查二进制文件和库中的库引用,以便解决此问题。

更简洁的方式:

将您的二进制文件安装到 /usr/local/bin 并提供任何要安装到 /usr/local/lib.dylib .这更好,因为 /usr/local 是用户二进制文件的地方,您不需要上面的 faff。

关于c++ - @executable_path 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33167503/

相关文章:

Python扩展DLL安装

C++理解默认参数中的引用

ios - Xcode - 如何找到我的 .app 文件?

linux - 有没有办法将 .rodata 段映射到不同的程序头中?

c++ - 链接器给出了一个我根本没有在我的应用程序中使用过的函数的错误

c - 如何反转 R_X86_64_JUMP_SLOT 重定位?

c++ - 将一个文件分割成多个文件

c++ - C++中有字符串吗?

javascript - 使用Command + Z时如何关闭Safari打开上一页?

macos - zsh——似乎不区分大小写?