如何在 gcc 中静态链接共享库函数?
在 gcc 中,这是不支持的。事实上,我所知道的任何现有的编译器/链接器都不支持。
请参阅:
Http://www.linuxquestions.org/questions/linux-newbie-8/forcing-static-linking-of-shared-libraries-696714/
您需要库的静态版本来链接它。
共享库实际上是一种特殊格式的可执行文件 具有指定的入口点(以及一些棘手的寻址问题) (包括) 静态链接。
不能静态链接共享库(或动态链接静态库)。
标志 -static将强制链接器使用静态库(。A)代替共享(。所以)一。但是默认情况下并不总是安装静态库,因此您可能必须自己安装静态库。
-static
另一种可能的方法是使用 统计员或 白貂。这两个工具都采用动态链接的可执行文件作为输入,并将其作为输出创建一个包含所有共享库的自包含的可执行文件。
如果你想链接,比如说,“力巴普利果汁”静态链接,而不是,比如说,天竺葵汁,你可以这样链接:
gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary
有一个警告——如果 liborangejuice使用 libapplejuice,那么 libapplejuice也将被动态链接。
liborangejuice
libapplejuice
您必须将 liborangejuice与 libapplejuice静态地连接起来才能得到 libapplejuice静态。
而且不要忘记保持 -Wl,-Bdynamic,否则你将最终链接所有静态的东西,包括 libc(这不是一件好事)。
-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命令:
ld
gcc
gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so
(当然,您必须从 sourcename.c编译 objectname.o,而且您可能还应该创建自己的共享对象库。如果需要,请使用 -Wl,--library-path,.,这样 ld 就可以在本地目录中找到库。)
sourcename.c
objectname.o
-Wl,--library-path,.
您收到的实际错误是:
/usr/bin/ld: attempted static link of dynamic object `libnamespec.so' collect2: error: ld returned 1 exit status
希望能帮上忙。