问题
在头文件中已经包含了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)
许多数学函数(pow
、sqrt
、fabs
、>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)