在尝试使用cmake编译代码。
在写CMakeLists的时候发现例如sqrt这样的函数,在libm.so中,就需要在编译的时候链接。
但是像malloc、memset、free这样的函数就不用链接动态库。
请问这其中有什么规律吗?
在尝试使用cmake编译代码。
在写CMakeLists的时候发现例如sqrt这样的函数,在libm.so中,就需要在编译的时候链接。
但是像malloc、memset、free这样的函数就不用链接动态库。
请问这其中有什么规律吗?
在写CMakeList时,由于像malloc printf这类函数,都是属于标准库的函数,在好多linux系统中已经将其默认的链接进去,所以在写时并不需要我们手动进行链接,但是math库并不是一个标准库,linux系统并没有默认的链接这个库文件,因此你需要手动显式的进行链接。
math.h里的函数需要libm,486以前CPU不集成协处理器,有的机器会没有协处理器,这时浮点运算需要软件模拟。为了节约内存和链接时间,所以早期编译软件包括Turbo C都把不常用的数学运算单独做一个模块,不用浮点运算就不需要它了,甚至可能在libm里实现了支持浮点版本的printf。
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答3.3k 阅读
你说的
malloc、memset、free
都是属于C标准库的,gcc会帮我们链接,但是sqrt
属于数学库不属于标准库,所以需要手动-lm
,写个Hello World
,然后-v
编译下:最后几行就可以看到到底链接了什么:
或者
ldd a.out
可以看程序链接了哪些动态库