Sam*_*iao 99
参考:
http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2004-05/0436.html
您需要链接库的静态版本.
共享库实际上是一种特殊格式的可执行文件,其中指定了入口点(包括一些粘性寻址问题).它没有静态链接所需的所有信息.
您不能静态链接共享库(或动态链接静态)
标志-static将强制链接器使用静态库(.a)而不是共享(.so)但是.默认情况下,并不总是安装静态库.因此,如果您需要静态链接,则必须安装静态库.
另一种可能的方法是使用statifier或Ermine.这两个工具都将动态链接的可执行文件作为输入,并且输出创建了包含所有共享库的自包含可执
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(这不是一件好事).
小智 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)
是的,我知道这是一个8年前的问题,但我被告知可以静态链接到共享对象库,当我搜索有关它的更多信息时,这确实是最受欢迎的.
要实际证明静态链接共享对象库是不可能的ld(gcc的链接器) - 而不是只是一群人坚持认为它是不可能的 - 使用以下gcc命令:
gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so
Run Code Online (Sandbox Code Playgroud)
(当然,你必须编译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
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中的二进制文件
最好的祝福
| 归档时间: |
|
| 查看次数: |
151146 次 |
| 最近记录: |