@executable_path无效

时间:2015-10-16 09:54:23

标签: c++ macos linker dynamic-library

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

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

但是,出于分配原因,我想让SDL2放弃二进制文件,因此我在/myapp/lib/libSDL2-2.0.0.dylib下复制了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'

如何设置dylib的搜索路径?

1 个答案:

答案 0 :(得分:1)

这是一个很难实现的痛苦。

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

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

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

    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"
    
  4. 我没有对此进行过测试,可能会出现错误。使用otool -L检查二进制文件和库中的库引用,以便回答此问题。

    更清洁的方式:

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