gpt4 book ai didi

macos - install_name_tool 更新可执行文件以在 Mac OS X 中搜索 dylib

转载 作者:行者123 更新时间:2023-12-02 03:50:19 28 4
gpt4 key购买 nike

我有一个安装在 /PATH/lib 中的动态库 libtest.dylib,以及一个执行二进制文件 myapp,它使用安装在 /PATH/bin 中的 dylib >。

我可以运行 myapp 来查找 dylib,如下所示 ( Is it OK to use DYLD_LIBRARY_PATH on Mac OS X? And, what's the dynamic library search algorithm with it? ):

DYLD_LIBRARY_PATH="/PATH/lib" myapp 

我想我可以使用install_name_tool来更新库和可执行文件,以便可以通过rpath找到该库。我使用了这篇文章中的提示 - How can I specify the rpath in a dylib?

在lib中,我执行了这个命令来添加rpath。

install_name_tool -id "@rpath/libtest.dylib" libtest.dylib
install_name_tool -add_rpath "@executable_path/../lib/" libtest.dylib

在 bin 中,我执行了 install_name_tool -add_rpath "@executable_path/../lib/"myapp

但是,当我在 bin 目录中执行 myapp 时,出现错误消息。

dyld: Library not loaded: libtest.dylib
Referenced from: /PATH/bin/./myapp
Reason: image not found
Trace/BPT trap: 5

otool -l myapp 显示 myapp 中的 rpath 已正确更新。

Load command 16
cmd LC_RPATH
cmdsize 40
path @executable_path/../lib/ (offset 12)

libtest.dylib 也是如此

Load command 13
cmd LC_RPATH
cmdsize 40
path @executable_path/../lib/ (offset 12)

可能出了什么问题?

添加

当然,我可以在编译和链接时使用 cc -install_name ,但我想知道如何修改生成的 dylib 和执行二进制文件来执行相同的操作。

来自库:

cc -install_name "@loader_path/../lib/libtest.dylib" -dynamiclib -o libtest.dylib test.c

或者,install_name 可以使用@rpath:

cc -install_name "@rpath/libtest.dylib" -dynamiclib -o libtest.dylib test.c

从垃圾箱:

cc -I../lib -c main.c
cc -o main main.o ../lib/libtest.dylib -Wl,-rpath -Wl,@loader_path/../lib

或者只是一行:

cc -I../lib -L../lib -o main main.c -ltest -Wl,-rpath -Wl,@loader_path/../lib

最佳答案

通过otool -l,我分析了应从原始库和二进制文件中添加或修改哪些内容。

动态库

更改在 id 中:

Load command 2 <-- OLD
cmd LC_ID_DYLIB
cmdsize 40
name libtest.dylib (offset 24)
time stamp 1 Wed Dec 31 18:00:01 1969

Load command 2 <-- NEW
cmd LC_ID_DYLIB
cmdsize 64
name @loader_path/../lib/libtest.dylib (offset 24)

这是完成更改的命令:

install_name_tool -id "@loader_path/../lib/libtest.dylib" libtest.dylib 

或者使用rpath:

install_name_tool -id "@rpath/libtest.dylib" libtest.dylib

可执行文件

有两个变化:rpath 和 load_dylib

Load command 12 <-- OLD
cmd LC_LOAD_DYLIB
cmdsize 40
name libtest.dylib (offset 24)

Load command 12 <-- NEW
cmd LC_LOAD_DYLIB
cmdsize 64
name @loader_path/../lib/libtest.dylib (offset 24)

这是完成更改的命令

install_name_tool -change libtest.dylib @loader_path/../lib/libtest.dylib myapp 

我还需要添加 rpath

Load command 14
cmd LC_RPATH
cmdsize 32
path @loader_path/../lib (offset 12)

这是完成加法的命令:

 install_name_tool -add_rpath "@loader_path/../lib" myapp

想法

二进制文件尝试查找库,它从 install_name_tool -add_rpath "@loader_path/../lib"myapp 知道它所在的位置。它加载库,库的 id 为 @rpath/libtest.dylib,其中 @rpath 设置为 @loader_path/../lib在可执行二进制文件中进行匹配。

引用

Cmake

使用 CMake 时,我们可以通过在 CMakeLists.txt 文件中添加以下内容来自动化该过程。

图书馆

应添加 ID。

# https://cmake.org/pipermail/cmake/2006-October/011530.html
SET_TARGET_PROPERTIES (test
PROPERTIES BUILD_WITH_INSTALL_RPATH 1
INSTALL_NAME_DIR "@rpath"
)
可执行文件

应指定 rpath:

SET(CMAKE_INSTALL_RPATH "@loader_path/../lib/libtest.dylib")

关于macos - install_name_tool 更新可执行文件以在 Mac OS X 中搜索 dylib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33991581/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com