C++编译的时候,怎么判断链接的是动态库还是静态库?

2019-03-30 15:42:31 +08:00
 jiang1234321

g++ test.cpp -L./ -lmylib -o test

请问,编译器是如何判断 mylib 是静态库还是动态库?是通过后缀吗?那直接改后缀可以吗?

3652 次点击
所在节点    问与答
9 条回复
jiang1234321
2019-03-30 15:44:16 +08:00
测试了一下,直接改.a 为.so 是可以正常编译运行 test 的
lcdtyph
2019-03-30 16:00:43 +08:00
静态库和动态库的文件格式不一样的
.a 和.so 只是约定好的文件后缀,-l 参数会依次寻找对应的.so 和.a 文件

在 win 的 cl.exe 上情况有一些变化,动态链接还需要在头文件里声明
SPACELAN
2019-03-30 16:07:50 +08:00
-l 会先匹配.so 再匹配.a,如果想要显式链接静态库,可以直接写静态库路径
Gcourage
2019-03-30 16:30:48 +08:00
用 file 命令可以查看是什么文件。
g++最终会调动 ld 命令去链接的,应该 ld 工具会根据文件来做静态链接,还是动态链接。

Linux 上对文件后缀名不太敏感
jiang1234321
2019-03-30 17:56:43 +08:00
@lcdtyph 这个倒是了解一点,主要是除了后缀之外,动态库和静态库的区别是什么,为什么 file 出来的结果会不一样?
liuminghao233
2019-03-30 18:55:22 +08:00
csapp 705 页
PPing520
2019-03-30 19:20:28 +08:00
静态库是打包在可执行文件一起的,动态库的动态链接有多种情况:1,启动时链接,2,运行时链接,并不包含在可执行文件之中
lcdtyph
2019-03-30 19:59:25 +08:00
@jiang1234321
静态库就是简单的.o (可重定位文件)文件的打包
动态库就更像是一个可执行文件了,也是 elf 格式的一种。有些动态库甚至可以直接执行。
mikeguan
2019-03-30 21:41:36 +08:00
Linux 是根据魔数确定文件类型的,一般情况下和后缀没关系。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/550275

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX