如何在gcc中静态链接共享库函数?
答案 0 :(得分:95)
参考:
http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2004-05/0436.html
您需要链接库的静态版本。
共享库实际上是一种特殊格式的可执行文件 指定了入口点(以及一些粘性寻址问题 包括在内)。它没有所需的全部信息 静态链接。
您无法静态链接共享库(或动态链接静态)
标志-static将强制链接器使用静态库(.a)而不是共享(.so) 但。默认情况下,并不总是安装静态库。因此,如果您需要静态链接,则必须安装静态库。
另一种可能的方法是使用statifier或Ermine。这两个工具都将动态链接的可执行文件作为输入,并且输出创建了包含所有共享库的自包含可执行文件。
答案 1 :(得分:72)
如果你想静态地链接,比如 libapplejuice ,而不是 liborangejuice ,你可以像这样链接:
gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary
有一点需要注意 - 如果liborangejuice
使用libapplejuice
,那么libapplejuice
也会动态关联。
您必须将liborangejuice
静态链接到libapplejuice
以获得libapplejuice
静态。
并且不要忘记保留-Wl,-Bdynamic
否则你最终会将所有内容链接起来,包括libc
(这不是一件好事)。
答案 2 :(得分:18)
如果你有共享库的.a文件(.so),你可以简单地用它的完整路径包含它,好像它是一个目标文件,如下所示:
这只通过编译生成main.o:
gcc -c main.c
这将该对象文件与相应的静态库链接并创建可执行文件(名为“main”):
gcc main.o mylibrary.a -o main
或者在一个命令中:
gcc main.c mylibrary.a -o main
它也可以是绝对或相对路径:
gcc main.c /usr/local/mylibs/mylibrary.a -o main
答案 3 :(得分:7)
是的,我知道这是一个8年前的问题,但我被告知可以静态链接共享对象库,当我搜索有关它的更多信息时,这确实是最受欢迎的。 / p>
要真正证明使用ld
(gcc
的链接器)无法静态链接共享对象库 - 而不是只有一群人坚持它&# 39; s不可能 - 使用以下gcc
命令:
gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so
(当然你必须从objectname.o
编译sourcename.c
,你也应该组建自己的共享对象库。如果你这样做,请使用{ {1}}以便ld可以在本地目录中找到您的库。)
您收到的实际错误是:
-Wl,--library-path,.
希望有所帮助。
答案 4 :(得分:6)
有点晚了但是...我找到了几年前我保存过的一个链接,我觉得这对你们有用:
CDE:自动创建可移植Linux应用程序
http://www.pgbovine.net/cde.html
执行二进制传递作为参数,您想要的二进制文件的名称是可移植的,例如: nmap
./ cde_2011-08-15_64bit nmap
该程序将读取链接到nmap及其依赖关系的所有库,并将所有这些库保存在名为 cde-package / 的文件夹中(与您所在的目录相同)。
请记住,要启动便携式程序,您必须执行位于 cde-package / nmap.cde
中的二进制文件祝你好运
答案 5 :(得分:0)
在gcc中,不支持此功能。实际上,我所知道的任何现有编译器/链接器都不支持这种情况。