代码之家  ›  专栏  ›  技术社区  ›  ozzy

mac中的动态链接器没有读取rpath

  •  0
  • ozzy  · 技术社区  · 2 年前

    我正在m2mac上编译一个简单的C程序,该程序依赖于macOS上使用clang的共享库。我正在使用-Wl、-rpath、@executable_path/..正确设置rpath/传奇旗帜。我已经通过使用otool检查可执行文件来验证了这一点,它显示了正确的rpath。

    但是,当我尝试运行程序时,动态链接器(dyld)在指定的路径中找不到库。只有当我将DYLD_LIBRARY_PATH环境变量设置为库(libdynamicclib.dylib)所在的位置时,该程序才能工作。

    为什么dyld不使用我设置的rpath?我是不是把rpath设置错了? enter image description here

    这是我用来编译程序的命令:

    clang-I./saga-L./saga-ldynamiclib-Wl,-rpath,@executable_path//传奇主旋律。c

    1 回复  |  直到 2 年前
        1
  •  1
  •   Siguza    2 年前

    Rpath只对实际使用的查找很重要 @rpath ,但看起来你的库不是。它的安装名称只是 libdynamiclib.dylib ,但它需要 @rpath/libdynamiclib.dylib .

    运行此程序,然后重新编译主二进制文件:

    install_name_tool -id '@rpath/libdynamiclib.dylib' ../saga/libdynamiclib.dylib
    codesign -s - -f -o linker-signed ../saga/libdynamiclib.dylib
    

    (第二个命令只是更新默认的链接器生成的签名,如果您有自己的代码签名过程,那么显然只需使用它。)

    如果您想深入了解安装名称的工作原理,请参阅 this post of mine .