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

sur*_*esh 127 linux gcc

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

Sam*_*iao 99

参考:

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.这两个工具都将动态链接的可执行文件作为输入,并且输出创建了包含所有共享库的自包含可执

  • 静态库有哪些信息,以便它可以静态链接,动态库没有? (7认同)

Eug*_*jak 74

如果你想静态地链接libapplejuice,而不是liborangejuice,你可以像这样链接:

gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary
Run Code Online (Sandbox Code Playgroud)

有一个警告 - 如果liborangejuice使用libapplejuice,那么libapplejuice也将动态链接.

你必须liborangejuice静态链接libapplejuice以获得libapplejuice静态.

并且不要忘记保留-Wl,-Bdynamic其他你最终会将所有内容链接起来,包括libc(这不是一件好事).

  • 难道没有办法告诉gcc静态链接什么,而不是绕过他并与链接器交谈? (2认同)

小智 18

如果你有共享库的.a文件(.so),你可以简单地用它的完整路径包含它,好像它是一个目标文件,如下所示:

这只通过编译生成main.o:

gcc -c main.c
Run Code Online (Sandbox Code Playgroud)

这将该对象文件与相应的静态库链接并创建可执行文件(名为"main"):

gcc main.o mylibrary.a -o main
Run Code Online (Sandbox Code Playgroud)

或者在一个命令中:

gcc main.c mylibrary.a -o main
Run Code Online (Sandbox Code Playgroud)

它也可以是绝对或相对路径:

gcc main.c /usr/local/mylibs/mylibrary.a -o main
Run Code Online (Sandbox Code Playgroud)


Ian*_*ote 9

是的,我知道这是一个8年前的问题,但我被告知可以静态链接到共享对象库,当我搜索有关它的更多信息时,这确实是最受欢迎的.

要实际证明静态链接共享对象库是不可能的ld(gcc的链接器) - 而不是只是一群人坚持认为它是不可能的 - 使用以下gcc命令:

gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so
Run Code Online (Sandbox Code Playgroud)

(当然,你必须编译objectname.osourcename.c,你可能要弥补自己的共享对象库也是如此.如果你这样做,使用-Wl,--library-path,.使LD可以找到你的本地目录库).

您收到的实际错误是:

/usr/bin/ld: attempted static link of dynamic object `libnamespec.so'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.


小智 7

有点晚了但是......我找到了几年前我保存过的链接,我认为这对你们有用:

CDE:自动创建可移植的Linux应用程序

http://www.pgbovine.net/cde.html

  • 只需下载该程序
  • 执行二进制传递作为参数,您想要的二进制文件的名称是可移植的,例如:nmap

    ./cde_2011-08-15_64bit nmap

该程序将读取链接到nmap及其依赖项的所有库,它将所有这些库保存在名为cde-package /的文件夹中(与您所在的目录相同).

  • 最后,您可以压缩文件夹并在任何系统中部署可移植二进制文件.

请记住,要启动可移植程序,您必须执行位于cde-package/nmap.cde中的二进制文件

最好的祝福

  • 虽然没有完全提供问题的答案 - 它是问题的显着解决方案。 (2认同)
  • 该链接现在似乎已失效。 (2认同)