Answers:
参考:
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 -o main main.cc -Wl,-rpath=. -Wl,-Bdynamic -lB -Wl,-Bstatic -lA -Wl,-Bdynamic -L.
libB使用libA,它链接并且ldd
没有显示对libA的引用。可执行文件工作正常。已通过g ++ 4.7.3测试。
是的,我知道这是一个已有8年历史的问题了,但是有人告诉我可以静态链接到共享库,这在我搜索有关它的更多信息时实际上是最热门的。
要实际演示使用ld
(gcc
的链接器)无法静态链接共享库,而不是一堆坚持这一点的人,请使用以下gcc
命令:
gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so
(当然你必须编译objectname.o
从sourcename.c
,你可能要弥补自己的共享对象库也是如此。如果你这样做,使用-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中,不支持此功能。实际上,我所知道的任何现有编译器/链接器均不支持此功能。