linux gcc 库函数,关于linux:gcc中共享库函数的静态链接

如何在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,静态链接动态库?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值