Linux下使用math库发生undefined reference to sin pow sqrt的问题解决方法

当在Linux环境下编译遇到未定义的引用错误,如sin、pow、sqrt,通常是由于缺少对math库的链接。解决方法是在gcc命令或makefile中添加-lm参数,或者在CMake项目中使用target_link_libraries链接math库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux下使用math库发生undefined reference to sin pow sqrt的问题解决方法

问题

在头文件中已经包含了math.h但是在linux上make时仍然报错

问题产生的原因

明明是包含了math.h头文件的,怎么还显示sin没有定义呢?

原来,gcc的sin函数是定义在libm.so里面了。

用-l选项定义指定的路径。不填写的话默认是/lib和/usr/lib内。

因为linux下所有的函数库都是以lib开头的。所以除去头和尾,那么m就是代表libm.so(m是库名,libm.so是库文件名)
在使用“ -l”参数时,通常的习惯是除去“lib”函数库头和后面的版本号,使用库名和参数“-l”连接,形成“-lm”。于是,我们需要在gcc找不到库时,可是使用“-l”直接给定库名。

(再补充一下:如果库不在默认路径的话,用“-L”选项即可添加路径,gcc sin.c -lm -o sin等价于gcc sin.c -lm -L/lib -L/usr/lib -o sin)

网上都说libm.so在/lib或是/usr/lib下

解决方案

如果您在头文件中包含了math.h,但是在Linux上使用make时仍然出现错误,可能是因为makefile没有正确链接到math库。

在makefile中,您需要在链接器中包含"-lm"参数,以告诉编译器链接到标准数学库。例如:

gcc program.c -o program -lm

这应该解决“undefined reference to ‘sin’”错误。如果问题仍然存在,请确保您的makefile正确链接了所有必需的库。

**在使用CMake时,**您可以通过在CMakeLists.txt中设置target_link_libraries来链接数学库。例如:

add_executable(my_program my_program.c)
target_link_libraries(my_program m)

在这个例子中,add_executable将源文件my_program.c编译成my_program可执行文件。然后,target_link_libraries链接数学库libm.so(即’-lm’)。这将确保您的程序可以正确使用数学函数(例如sin)。

请注意,在CMake中使用target_link_libraries时,不需要在链接器命令中包含"-lm"参数。这是因为cmake已经知道需要链接数学库,并将它们自动添加到生成的Makefile中。

参考

(12条消息) undefined reference to ‘sin’_dev c++ undefined reference to sin_odaynot的博客-CSDN博客

如何使用 CMake 链接到 C 数学库? - IT屋-程序员软件开发技术分享社区 (it1352.com)

许多数学函数(powsqrtfabs>log 等)在 math.h中声明需要链接库 libm.与自动链接的 libc 不同,libm 是一个单独的库,通常 需要显式链接.链接器假定所有库都以lib,所以要链接到 libm 你链接到 m.

你必须像 target_link_libraries(ch4 m) 一样使用它来将 libm 链接到你的目标.第一个参数必须是一个目标.因此它必须在 add_executable(ch4 ch4.c) 之后使用,如:

add_executable(ch4 ch4.c)
target_link_libraries(ch4 m)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值