gpt4 book ai didi

macos - 是否可以相对地使用 clang++ 链接 dylib 而不使用 install_name_tool?

转载 作者:行者123 更新时间:2023-12-03 12:30:34 24 4
gpt4 key购买 nike

概括

将可执行文件与 dylib 链接时,是 install_name_tool使 dylib 路径相对于可执行文件的唯一方法,或者在 clang 的链接步骤中是否有这样做的方法?

设置

鉴于以下项目结构:

 - Project Root
| compile.sh
- lib_src
| myprint.cpp
| myprint.h
- main_src
| main.cpp

使用这些文件: https://gist.github.com/JohannesMP/8fa140b60b8ffeb2cae0

运行 compile.sh (为了简单起见在这里使用而不是 make 文件)产生以下文件:
 - Project Root
| main (a unix executable linked to myprint.dylib)
| myprint.dylib (a dynamic library that main uses)

使用 ./main 运行程序而 cd 'd 进入项目工作正常,但尝试从其他任何地方运行它,例如通过简单地双击它,将导致以下错误:
dyld: Library not loaded: myprint.dylib
Referenced from: /Users/Jo/Sandbox/libtest/main
Reason: image not found
Trace/BPT trap: 5

使用 otool 检查 main 时我可以看到这是因为 myprint.dylib 的路径不是根据可执行文件定义的:
$ otool -L main
main:
myprint.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)

一般修复

据我所知,解决此问题的建议方法是使用 install_name_tool -change并修改路径以使用 @executable_path :
install_name_tool -change myprint.dylib @executable_path/myprint.dylib main

问题

虽然上述修复显然有效,但在我看来,没有办法告诉 clang 只链接 main 似乎有些不直观。以这样的方式它已经使用了 @executable_path开始。使用任意数量的 dylib 编译程序时,必须对每个 dylib 执行此操作,这似乎很奇怪。

这真的是唯一的方法吗?这是 cmake 和 xcode 在幕后所做的吗?为什么我们不能只拥有 clang++默认情况下相对而不是绝对链接?

我找到了一些可以简化流程的工具,例如 mac dylib bundler ,但我很好奇是否有人对为什么这样做有任何见解。

TL; 博士

有没有办法到 change just this line避免必须运行 install_name_tool -change ?

最佳答案

确实有可能:

在编译我的库时,我设置了它的 install_name@rpath 而言:

clang++ -dynamiclib lib_src/myprint.cpp -o myprint.dylib -install_name @rpath/myprint.dylib

然后在编译可执行文件时我设置 rpath@executable_path 而言,这可以在一个步骤中完成:
clang++ main_src/main.cpp -o main -I ./lib_src myprint.dylib -rpath @executable_path 
@rpath的详细解释和 @executable_path请查看此维基: https://wincent.com/wiki/@executable_path,_@load_path_and_@rpath

关于macos - 是否可以相对地使用 clang++ 链接 dylib 而不使用 install_name_tool?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31823999/

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