gcc中共享库函数的静态链接

时间:2009-04-07 12:34:56

标签: linux gcc

如何在gcc中静态链接共享库函数?

6 个答案:

答案 0 :(得分:95)

参考:

http://www.linuxquestions.org/questions/linux-newbie-8/forcing-static-linking-of-shared-libraries-696714/

http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2004-05/0436.html

您需要链接库的静态版本。

共享库实际上是一种特殊格式的可执行文件 指定了入口点(以及一些粘性寻址问题 包括在内)。它没有所需的全部信息 静态链接。

您无法静态链接共享库(或动态链接静态)

标志-static将强制链接器使用静态库(.a)而不是共享(.so) 但。默认情况下,并不总是安装静态库。因此,如果您需要静态链接,则必须安装静态库。

另一种可能的方法是使用statifierErmine。这两个工具都将动态链接的可执行文件作为输入,并且输出创建了包含所有共享库的自包含可执行文件。

答案 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>

要真正证明使用ldgcc的链接器)无法静态链接共享对象库 - 而不是只有一群人坚持它&# 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中,不支持此功能。实际上,我所知道的任何现有编译器/链接器都不支持这种情况。