使用一些编译器,using pow
and certain other functions in a C program requires linking to the m
library。但是,有些编译器不需要这样做,并且在链接到m
库时会出错。在C++中,std::thread
和pthread
存在几乎相同的情况,但CMake模块FindThreads
完全消除了这一点-libm是否有类似的模块?
什么是最好的方法来检测与CMake做什么?这是我目前的解决方案,这是不太理想的,因为有更多的C编译器不仅仅是GCC和MSVC:
if(NOT MSVC)
target_link_libraries(my-c-target PUBLIC m)
endif()
这符合我的目的,但我很确定在某些情况下它会失败,需要手动用户干预,这对不知道这种晦涩的人来说并不有趣。理想情况下,我不希望用户必须通过命令行指定他们的编译器是否是weird;我想在CMake中自动检测它,因为这是CMake的全部意义。
3条答案
按热度按时间bvjxkvbb1#
您应该使用
CHECK_FUNCTION_EXISTS
命令来检查pow
是否可以在没有附加标志的情况下使用。如果此检查失败,您可以将m
库添加到CMAKE_REQUIRED_LIBRARIES
变量,假设缺少的是针对libm
的链接。但是您需要再次使用CHECK_FUNCTION_EXISTS
来确保链接是足够的。样本代码:
fzwojiic2#
对于编译器来说,检查某些代码是否正确的常用方法是try_compile。
use_pow.c:
CMakeLists.txt:
缓存条目
POW_LIBS
包含使用pow
函数所需的库。mlnl4t2r3#
如果我理解正确,链接
libm
总是首选的,如果它存在。所以CheckLibraryExists可以用。
CMakeLists.txt
已在Linux x86_64、glibc 2.23和cmake 3.13.2下测试