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

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

186799 次浏览

在 gcc 中,这是不支持的。事实上,我所知道的任何现有的编译器/链接器都不支持。

请参阅:

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

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

共享库实际上是一种特殊格式的可执行文件 具有指定的入口点(以及一些棘手的寻址问题) (包括) 静态链接。

不能静态链接共享库(或动态链接静态库)。

标志 -static将强制链接器使用静态库(。A)代替共享(。所以)一。但是默认情况下并不总是安装静态库,因此您可能必须自己安装静态库。

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

如果你想链接,比如说,“力巴普利果汁”静态链接,而不是,比如说,天竺葵汁,你可以这样链接:

gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary

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

您必须将 liborangejuicelibapplejuice静态地连接起来才能得到 libapplejuice静态。

而且不要忘记保持 -Wl,-Bdynamic,否则你将最终链接所有静态的东西,包括 libc(这不是一件好事)。

如果你有。共享库的文件(。所以)你可以简单地把它包含在它的完整路径中,就像它是一个目标文件一样,像这样:

这通过编译生成 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

有点晚了,但是... 我找到了几年前保存的一个链接,我想它可能对你们有用:

CDE: 自动创建便携式 Linux 应用程序

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

  • 下载程序
  • 执行作为参数的二进制文件,传递所需的可移植二进制文件的名称,例如: < strong > nmap

    ./cde _ 2011-08-15 _ 64位 nmap

该程序将读取所有链接到 nmap 及其依赖项的库,并将它们全部保存在一个名为 Cde-套件/的文件夹中(与您所在的目录相同)。

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

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

最好的问候

是的,我知道这是一个8年前的问题,但是我被告知静态链接到一个共享对象库是可能的,而且当我搜索更多关于它的信息时,这真的是最热门的。

为了证明使用 ld(gcc的链接器)静态链接一个共享对象库是不可能的——而不是只有一群人坚持认为这是不可能的——使用以下 gcc命令:

gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so

(当然,您必须从 sourcename.c编译 objectname.o,而且您可能还应该创建自己的共享对象库。如果需要,请使用 -Wl,--library-path,.,这样 ld 就可以在本地目录中找到库。)

您收到的实际错误是:

/usr/bin/ld: attempted static link of dynamic object `libnamespec.so'
collect2: error: ld returned 1 exit status

希望能帮上忙。