如何解决即使在创建过程中链接后,可执行文件是否还需要 so 文件?
我已经开始研究将库与 exe 链接并在 Linux 机器上工作的概念。我正在努力理解将 so 文件与可执行文件链接的概念。
app:$(CC) $(CFLAGS) $(LDFLAGS) app.o app_dep.o -L . -ldynamic -Wl,-rpath . \
-o app
我正在尝试使用 makefile 中的上述行创建一个可执行应用程序。我必须将它与工作目录中存在的 libdynamic.so
文件链接。所以我使用 -L
标志和 -rpath
来指向 so 文件的目录和名称。它工作并创建了可执行文件。
但是当我尝试运行可执行文件时,它再次抱怨 libdynamic.so: cannot open shared object file: No such file or directory
。
- 为什么我需要它,因为我在创建可执行文件本身期间链接了共享库?
如果问题的答案是“是的,即使它已链接,也需要指向该库”。我怎么能指向它在二进制执行过程中出现的文件夹?
我发现的一种方法是使用 LD_LIBRARY_PATH
环境变量。没有环境变量还有其他办法吗?
谢谢
解决方法
为什么我需要它,因为我在创建可执行文件时链接了共享库?
因为链接共享库不会将该共享库嵌入到可执行文件中。这是链接共享库与链接存档库之间的主要区别。
我怎么能指向它在二进制执行过程中出现的文件夹?
UNIX 中没有“文件夹”。它们是目录。
在当前目录中创建可执行文件的正确链接命令是:
gcc -o app app.o ... -L. -ldynamic -Wl,-rpath=.
请注意,通常这样做是一个非常糟糕的主意:您的可执行文件是否会运行取决于您的当前目录(或者它可能使用不同版本的 libdynamic.so
,具体取决于您在哪个目录中)。
如果您在存在 app
的目录中调用 libdynamic.so
(即如果您像 ./app
一样调用它),您的链接命令应该有效,但如果您使用 {{1} }(并且不在同一个目录中)。
一个明显更好的方法是这样做:
/path/to/app
这告诉 gcc -o app app.o ... -L. -ldynamic -Wl,-rpath='$ORIGIN'
二进制文件在 app
所在的同一目录中查找 libdynamic.so
,而不管您当前的目录是什么。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。