如何在gcc中静态链接共享库函数?
静态链接是什么意思? 您是否希望在不需要.so的情况下分发您的可执行文件?
参考:
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)
但。默认情况下,并不总是安装静态库。因此,如果您需要静态链接,则必须安装静态库。
另一种可能的方法是使用statifier或Ermine。这两个工具都将动态链接的可执行文件作为输入,输出创建自包含的可执行文件,并嵌入所有共享库
静态库有哪些信息,以便它可以静态链接,动态库没有?
如果你想静态地链接libapplejuice,而不是liborangejuice,你可以像这样链接:
gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary
有一点需要注意 - 如果liborangejuice使用libapplejuice,那么libapplejuice也会动态链接。
您必须静态链接liborangejuice和libapplejuice以获得libapplejuice静态。
并且不要忘记保留-Wl,-Bdynamic否则你最终会将所有静态链接起来,包括libc(这不是一件好事)。
有没有办法告诉gcc静态链接什么,而不是绕过他并与链接器交谈?
@ElazarLeibovich你不能以这种方式获得静态和动态的组合。
@EugeneBujak:警告不适用于我的系统。 示例:gcc -o main main.cc -Wl,-rpath=. -Wl,-Bdynamic -lB -Wl,-Bstatic -lA -Wl,-Bdynamic -L. libB使用libA,它链接且ldd不显示对libA的引用。 可执行文件正常。 用g ++ 4.7.3测试。
如果你有共享库的.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
是的,我知道这是一个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
希望有所帮助。
有点晚了但是......我找到了几年前我保存过的链接,我认为这对你们有用:
CDE:自动创建可移植的Linux应用程序
http://www.pgbovine.net/cde.html
只需下载该程序
执行二进制传递作为参数,您想要的二进制文件的名称是可移植的,例如:nmap
./cde_2011-08-15_64bit nmap
该程序将读取链接到nmap及其依赖项的所有库,它将所有这些库保存在名为cde-package /的文件夹中(与您所在的目录相同)。
最后,您可以压缩文件夹并在任何系统中部署可移植二进制文件。
请记住,要启动可移植程序,您必须执行位于cde-package / nmap.cde中的二进制文件
最好的祝福
虽然没有完全提供问题的答案 - 这是一个值得注意的问题解决方案。
在gcc中,这不受支持。实际上,我所知道的任何现有编译器/链接器都不支持这一点。
你能解释一下现有编译器不支持静态链接吗?
@noloader,静态链接动态库?