@executable_path不起作用

@executable_path not working

本文关键字:不起作用 path @executable      更新时间:2023-10-16

我已经安装了SDL2。我可以用

链接我的程序
clang++ -lSDL2 -lv8 main.o test.o -o nano8

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

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'

如何设置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检查二进制文件和库中的库引用,以便在这个问题上home-in。

更干净的方式:

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