关于编译、链接的一些问题

2019-07-31 10:44:17 +08:00
 VDimos

我所知道的是有两种链接方式,一种是静态,一种是动态。 静态意思是把.a 文件打包到最后的可执行文件里,动态.so 是独立存在的,就像插件一样,可执行文件要的时候就调用。 那平时我们用别人的源代码,直接引用进自己的应用,然后再编译,这种过程还是像静态链接一样,最后产生的可执行文件实际上包含了我引用的源代码,那是不是也叫静态链接? 另外,静态链接在编译时需要手动定义头文件去知道链接的函数的调用方式,动态链接我看了下,是不需要吗? 最后,各位大佬,这方面的内容在哪里能够找到最为系统的讲解,有什么书吗?

1977 次点击
所在节点    程序员
11 条回复
yianing
2019-07-31 10:57:03 +08:00
程序员的自我修养
andj4cn
2019-07-31 10:57:37 +08:00
静态链接和动态链接都是针对库的。分别叫静态链接库和动态链接库。
1. 二者使用都必须提供头文件。
2. 静态库比较大,是全打包,很多使用不到的库放进去了,会导致应用程序太大。
3. 动态库是小的单元,可以让应用程序按需加载,应用程序不会很大。

我当时在配 OpenGL 开发环境的时候找了一些文章来看,忘了哪些文章了,可以从简单的 gcc 编译 cpp 代码开始。
VDimos
2019-07-31 11:09:20 +08:00
@yianing 谢谢大佬
VDimos
2019-07-31 11:10:17 +08:00
@andj4cn 我在看 rust 的编译,因为文档各方面都不是那么好找,所以很迷糊
darknoll
2019-07-31 11:16:59 +08:00
正式项目一般用 dll/so
darknoll
2019-07-31 11:20:47 +08:00
@andj4cn
可以没有头文件,调用的地方申明函数原型。dll 的话,连导入库都不需要。
Doragd
2019-07-31 11:25:43 +08:00
可以看《计算机系统基础》袁春风,在中国大学 mooc 上,有一章专门讲程序的链接,装载
pagxir
2019-07-31 11:30:48 +08:00
调用方式跟连接形式无关,跟编译器生产的代码有关。
season4675
2019-07-31 11:33:02 +08:00
你需要买一本《程序员的自我修养——链接、装载与库》 方法告诉你了,就看你会不会去看了。 提醒下,你说的这些个问题不解决,你的工作没法进行下去……
VDimos
2019-07-31 14:14:27 +08:00
@season4675 就感觉很奇怪,我的理解里要调用函数得写定义,可我看 rust 里的直接就可以像文件一样打开读取调用就行了
agagega
2019-07-31 21:07:26 +08:00
@VDimos 你需要知道头文件到底干了什么。函数声明说到底是给编译器看的。

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

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

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

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

© 2021 V2EX