gcc同时使用动态和静态链接

最近因为项目的makefile同时使用了静态动态的连接库,所以,就要同事的链接进去

我们知道gcc的-static选项可以使链接器执行静态链接。但简单地使用-static显得有些’暴力’,因为他会把命令行中-static后面的所有-l指明的库都静态链接,更主要的是,有些库可能并没有提供静态库(.a),而只提供了动态库(.so)。这样的话,使用-static就会造成链接错误。

之前的链接选项大致是这样的,

1 CORE_LIBS="$CORE_LIBS -L/usr/lib64/mysql -lmysqlclient -lz -lcrypt -lnsl -lm -L/usr/lib64 -lssl -lcrypto"

修改过是这样的,

1 2 CORE_LIBS="$CORE_LIBS -L/usr/lib64/mysql -Wl,-Bstatic -lmysqlclient -Wl,-Bdynamic -lz -lcrypt -lnsl -lm -L/usr/lib64 -lssl -lcrypto"

  其中用到的两个选项:-Wl,-Bstatic和-Wl,-Bdynamic。这两个选项是gcc的特殊选项,它会将选项的参数传递给链接器,作为链接器的选项。比如-Wl,-Bstatic告诉链接器使用-Bstatic选项,该选项是告诉链接器,对接下来的-l选项使用静态链接;-Wl,-Bdynamic就是告诉链接器对接下来的-l选项使用动态链接。下面是man gcc对-Wl,option的描述,

-Wl,option Pass option as an option to the linker. If option contains commas, it is split into multiple options at the commas. You can use this syntax to pass an argument to the option. For example, -Wl,-Map,output.map passes -Map output.map to the linker. When using the GNU linker, you can also get the same effect with -Wl,-Map=output.map.

下面是man ld分别对-Bstatic和-Bdynamic的描述,

-Bdynamic -dy -call_shared Link against dynamic libraries. You may use this option multiple times on the command line: it affects library searching for -l options which follow it. -Bstatic -dn -non_shared -static Do not link against shared libraries. You may use this option multiple times on the command line: it affects library searching for -l options which follow it. This option also implies --unresolved-symbols=report-all. This option can be used with -shared. Doing so means that a shared library is being created but that all of the library's external references must be resolved by pulling in entries from static libraries.

  值得注意的是对-static的描述:-static和-shared可以同时存在,这样会创建共享库,但该共享库引用的其他库会静态地链接到该共享库中。




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GCC是一个用于编译C和C++语言程序的开源编译器工具。gcc可以执行静态链接动态链接静态链接动态链接有什么区别? 静态链接 静态链接是指将所有代码、库文件和其他依赖项编译成一个可执行文件。所有的代码和库文件都被放置在可执行文件中,这意味着在程序运行时,所有的函数和代码都在可执行文件中被加载到计算机内存中。 由于所有的代码都在可执行文件中,这样的文件会比较大。另外,当一个静态链接库发生改变时,需要重新编译可执行文件。 动态链接 动态链接是指在程序运行时才加载库文件和其他依赖项,与静态链接形成的大文件不同,动态链接需要的函数和库文件在运行时从系统中加载,不过在编译器链接阶段需要包含引用库函数的信息。 当程序运行时,代码会加载到系统内存中,这时才会加载动态链接库和其他依赖项。 这种方式节约了内存空间,可以在程序运行时动态更新库。当一个动态链接库发生改变时,只需要替换文件即可,不需要重新编译可执行文件。 总结 静态链接是将所有代码和库文件编译成一个可执行文件,所有的函数和代码都在被加载到计算机内存中之前就被放置在可执行文件中。动态链接允许将库文件和其他依赖项在程序运行时加载到内存中,允许动态更新库文件。 两种链接方式都有优缺点。静态链接会使得文件变大,但是不需要依赖外部库文件。动态链接则会使得程序依赖外部库文件,但是可以让程序更加灵活地使用外部库。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值