对于一些编译器,using pow
and certain other functions in a C program requires linking to the m
library .然而,一些编译器不需要这个并且会在链接到 m
库时出错。具有 std::thread
和 pthread
的 C++ 存在几乎相同的情况,但 CMake 模块 FindThreads
完全缓解了这种情况 - 是否有一些类似的模块对于 libm?
检测使用 CMake 做什么的最佳方法是什么?这是我当前的解决方案,它不太理想,因为除了 GCC 和 MSVC 之外,还有更多的 C 编译器:
if(NOT MSVC)
target_link_libraries(my-c-target PUBLIC m)
endif()
这适用于我的目的,但我很确定在某些情况下它会失败并需要手动用户干预,这对于不了解这种模糊性的人来说并不有趣。理想情况下,我不希望用户必须指定他们的编译器是否为 weird或不通过命令行;我想在 CMake 中自动检测它,因为这是 CMake 的全部要点。
最佳答案
你应该使用 CHECK_FUNCTION_EXISTS
命令检查 pow
是否可以在没有附加标志的情况下使用。如果此检查失败,您可以将 m
库添加到 CMAKE_REQUIRED_LIBRARIES
变量,假设缺少针对 libm
的链接。但是您需要再次 CHECK_FUNCTION_EXISTS
以确保链接足够。
示例代码:
include(CheckFunctionExists)
if(NOT POW_FUNCTION_EXISTS AND NOT NEED_LINKING_AGAINST_LIBM)
CHECK_FUNCTION_EXISTS(pow POW_FUNCTION_EXISTS)
if(NOT POW_FUNCTION_EXISTS)
unset(POW_FUNCTION_EXISTS CACHE)
list(APPEND CMAKE_REQUIRED_LIBRARIES m)
CHECK_FUNCTION_EXISTS(pow POW_FUNCTION_EXISTS)
if(POW_FUNCTION_EXISTS)
set(NEED_LINKING_AGAINST_LIBM True CACHE BOOL "" FORCE)
else()
message(FATAL_ERROR "Failed making the pow() function available")
endif()
endif()
endif()
if (NEED_LINKING_AGAINST_LIBM)
target_link_libraries(your_target_here m)
endif()
关于在 C 中使用 pow 时,CMake 能否检测到我是否需要链接到 libm?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32816646/