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

lidabo lidabo     2023-02-20     700

关键词:

场景是这样的。我在写一个Nginx模块,该模块使用了MySQL的C客户端接口库libmysqlclient,当然mysqlclient还引用了其他的库,比如libm, libz, libcrypto等等。对于使用mysqlclient的代码来说,需要关心的只是mysqlclient引用到的动态库。大部分情况下,不是每台机器都安装有libmysqlclient,所以我想把这个库静态链接到Nginx模块中,但又不想把mysqlclient引用的其他库也静态的链接进来。
  我们知道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可以同时存在,这样会创建共享库,但该共享库引用的其他库会静态地链接到该共享库中。

静态库和动态库同时链接

在应用程序需要链接外部库的情况下,linux默认对库的链接是使用动态库,在找不到动态库的情况下再选择静态库。当动态库与静态库混合链接时,使用-static会导致所有的库都使用静态链接的方式,这时就需要-Wl的方式: gcc... 查看详情

gcc编译使用动态链接库和静态链接库(代码片段)

1库的分类根据链接时期的不同,库又有静态库和动态库之分。静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行。有别于静态... 查看详情

gcc系强制链接静态库(同时有.so和.a)

1.坑多的办法-static如果需要链接成不依赖任何so文件的程序,用ldd查看显示为"notadynamicexecutable",但是这个选项时不推荐的。即使像这样链接(c++):“-static-libgcc-static-libstdc++-static”  一是会出现警告,比如我使用了系统... 查看详情

利用gcc编译器生成动态链接库和静态链接库

...程gcc–shared–olibxxx.soxxx.o经过编译链接就可以生成动态链接库,其扩展名为.soEg.还可以gcc&n 查看详情

gcc后续——链接时的静态库和动态库

本篇文章是链接阶段静动态库的理解,</font>​​点击查看gcc四个阶段​​@TOC1.库库:分为静态库和动态库(本质也是文件)静态库:libXXXX.a动态库:libXXXX.so检测linux所用库​​ldd可执行程序​​,检测可执行程序被形成的时候... 查看详情

8静态函数库设计

...copy到程序中。2、导致的问题:如果有多个进程在内存中同时运行,并且使用了相同的库函数,那么就会有多份拷贝,这就是对空间的浪费。使用静态库-编译选项1.Linux下进行链接时默认是链接动态库2.如果需要使用静态库,需要... 查看详情

linux中链接库去掉后缀名,gcc如何区分链接的是动态库还是静态库?

参考技术A判定规则如下:–如果库目录中存在两种版本,gcc优先使用动态链接库;–如果目录只有静态版本,则采用静态链接库;–带有-static参数时,gcc将使用静态链接库,例如:gccfoo.c-static-lpthread-ofoo 查看详情

如何静态链接到libstdc++.喜欢升级的gcc的朋友快来看看

参考技术Agcc默认使用动态库方式链接,找不到动态库才会去找静态库,若要使用静态库需给链接器指定参数-static。 参考技术Bgcc默认使用动态库方式链接,找不到动态库才会去找静态库,若要使用静态库需给链接器指定参数-stat... 查看详情

我可以让 gcc 链接器创建一个静态库吗?

...:04:50【问题描述】:我有一个包含大约300个c++文件的库。使用该库的程序不想动态链接到它。(各种原因,但最好的是部分支持的平台不支持动态链接)然后我使用g++和ar创建一个静态库(.a),该文件包含所有这些文件的所有符号... 查看详情

linux动态链接和静态链接简析

参考技术Alinux动态链接和静态链接简析1.生成静态链接库gcc-ch.c-oh.oarcqslibh.ah.o//ar是生成库的命令,cqs是参数,libh.a是生成的静态链接库须以lib开头,h是库名,a表示是静态链接库,h.o是刚才生成目标文件2.生成动态链接库www.zhishiwu.co... 查看详情

请问,ld链接生成的时候,加载动态库/静态库顺序如何?

想了解,如果-lm命令的时候,同时有libm.a和libm.so的话,实际上用哪个?我在solaris上面做的试验,如果两个同时存在,则选择libm.so。如果只有libm.a那么-lm就是链接libm.a问题:所有平台都是这样的么?还是和我的具体使用的编译器或者... 查看详情

c中的动态库与静态库

...复制到程序文件的适当位置,最终生成可执行文件。使用静态链接库生成的文件通常体积较大,但运行时不再依赖库文件,可以拷贝到别的设备上运行。在Linux中静态链接库文件的后缀名通常用.a表示;在Windows系... 查看详情

在 gcc Linux 中将静态库链接到动态库

...在32位平台Linux下的“c++”上编写的静态库。现在我需要使用我的c++功能在64位平台Linux中编译“c”动态库。有人可以告诉我最好的方法来做到这一点。我知道我应该将所有函数原型放入extern"C&qu 查看详情

gcc生成静态库.a和动态库.so和opencv3.4.11的安装及使用示例(代码片段)

gcc生成静态库.a和动态库.so和OpenCV3.4.11的安装及使用示例文章目录gcc生成静态库.a和动态库.so和OpenCV3.4.11的安装及使用示例一、用gcc生成静态库和动态库(一)hello实例使用库1.准备过程2.静态库使用3.动态库的使用4.静态库与动态库... 查看详情

gcc编译过程与动态链接库和静态链接库(代码片段)

...操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)。windows上对应的是.lib.dlllinux上对应的是.a.so在这里先介绍下Linux下的gcc编译的几个选项g++-chellospeak.cpp会将hellospeak.cpp选项-c用来告诉编译器编译源代码但... 查看详情

第1章linux系统编程入门:动态链接库的创建和使用(代码片段)

文章目录动态库的制作动态库的基本工作原理如何使用动态链接库?法一:添加环境变量法二:修改etc/ld.so.cache文件列表动态库的制作一、命名规则Linux:libxxx.solib:前缀(固定)xxx:库的名字,自己起.so:后缀... 查看详情

gcc生成动态链接库

...件,相当于windows中的.obj文件.so为共享库,是sharedobject,用于动态连接的,和dll差不多.a为静态库,是好多个.o合在一起,用于静态连接.la为libtool自动生成的一些共享库,vi编辑查看,主要记录 查看详情

c语言学习笔记--动态库和静态库的使用

1.C语言中的链接器 (1)每个C语言源文件被编译后生成目标文件,这些目标文件最终要被链接在一起生成可执行文件。 (2)链接器的主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确的衔接... 查看详情