转载 - gcc/ld 动态连接库和静态连接库使用方法

简介: 本文介绍了如何在GCC中实现部分程序静态链接、部分动态链接。使用`-Wl`标志传递链接器参数,`-Bstatic`强制链接静态库,`-Bdynamic`强制链接动态库。

原文链接

https://www.zhihu.com/question/22940048

作者:qin meng

链接:https://www.zhihu.com/question/22940048/answer/222625910

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

gcc使用-Wl传递连接器参数,ld使用-Bdynamic强制连接动态库,-Bstatic强制连接静态库。所以部分静态,部分动态连接这么写:

gcc ... -Wl,-Bstatic -l<your-static-lib> -Wl,-Bdynamic -l<your-dynamic-lib> ...

举个例子,你想静态连接libA.a同时动态连接libB.so,(先保证你的连接路径-L里面能找到对应的静态或者动态库),这么写:

gcc ... -Wl,-Bstatic -lA -Wl,-Bdynamic -lB ...

这里需要注意,强制静态或者动态连接标记之后的链接库都将按照前面最近的一个标记进行链接,所以如果后面出现了一个libC,没有指定连接标记,那么libC将会被动态连接:

gcc ... -Wl,-Bstatic -lA -Wl,-Bdynamic -lB ... -lC

如果参数里面没指定强制的连接方式标记,那么gcc将按照默认的优先级去链接,优先动态链接,所以如果你这么写,且同时存在libC.solibC.a那么libC将被动态链接:

gcc ... -lC

由于-B连接标记会改变默认连接方式,所以在Makefile里面如果有人这么干:

LIBS += -Wl,-Bstatic -lC

那么他后面的LIBS+=的库就都只能以静态方式连接了,有时候这是不行的,因为没有静态库,所以会有人这么应对:

LIBS += -Wl,-Bdynamic -lD

这样就改回来了。但是这种胡乱改的行为是非常不好的,比较好的行为应该这样:

LIBS += -l<auto-link-lib>  
STATIC_LIBS += -l<static-lib>  
DYN_LIBS += -l<dynamic-lib>  
LDFLAGS := ${LIBS} -Wl,-Bstatic ${STATIC_LIBS} -Wl,-Bdynamic ${DYN_LIBS}

这样当你不关心怎么连接的时候用LIBS,当你想静态连接的时候用STATIC_LIBS,当你想动态连接的时候用DYN_LIBS。

作者:杨博东

链接:https://www.zhihu.com/question/22940048/answer/250351399

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

最高票qin meng的答案我编译出现这个错误:

/usr/bin/ld: cannot find -lgcc_s  
/usr/bin/ld: cannot find -lc  
/usr/bin/ld: cannot find -lgcc_s  
collect2: error: ld returned 1 exit status

然后搜到了gcc参数加上 -Wl,-Bdynamic -lgcc_s可以解决,最后我强制链接静态链接libfunc.a(我的目录下同时有 libfunc.alibfunc.so):

gcc main.c  -Wl,-Bstatic -lfunc -L. -Wl,-Bdynamic -lgcc_s

有关 gcc_s : https://gcc.gnu.org/onlinedocs/gccint/Libgcc.html

还有一种方法是直接指定静态链接的库全名:

gcc main.c -l:libfunc.a -L          // 这样也是静态链接libfunc.a
目录
相关文章
|
2月前
|
编译器 C语言 C++
列举gcc 常见和有用的编译警告选项
列举gcc 常见和有用的编译警告选项
13 0
|
2月前
|
编译器 C语言
gcc编译警告:warning: suggest parentheses around assignment used as truth value
gcc编译警告:warning: suggest parentheses around assignment used as truth value
23 0
|
2月前
|
编译器 Linux C语言
gcc编译器的使用方法
gcc编译器的使用方法
22 1
|
3月前
|
编译器 C语言
gcc/g++语法
gcc/g++语法
|
4月前
|
NoSQL 编译器 开发工具
006.gcc编译器
gcc是什么?
45 0
006.gcc编译器
|
5月前
|
存储 NoSQL 算法
从一个crash问题展开,探索gcc编译优化细节
问题分析的过程也正是技术成长之路,本文以一个gcc编译优化引发的crash为切入点,逐步展开对编译器优化细节的探索之路,在分析过程中打开了新世界的大门……
428 1
|
5月前
|
C语言
gcc静态编译/usr/bin/ld: cannot find -lc
gcc静态编译/usr/bin/ld: cannot find -lc
|
6月前
|
编译器 程序员 C语言
gcc的编译过程和gcc与g++的区别
gcc的编译过程和gcc与g++的区别
55 0
|
7月前
|
C语言
编译安装gcc
编译安装gcc
|
7月前
|
C语言 C++
cygwin的下的gcc的一点体会。
cygwin的下的gcc的一点体会。