在 C 中使用 pow 时,CMake 能否检测到我是否需要链接到 libm?

标签 c gcc cmake libm

对于一些编译器,using pow and certain other functions in a C program requires linking to the m library .然而,一些编译器不需要这个并且会在链接到 m 库时出错。具有 std::threadpthread 的 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/

相关文章:

c - 如何允许非选项参数以任何顺序获取 getopt?

c++ - OSI 层在代码中的实际实现

c - 修改有缓冲区溢出漏洞的C代码跳过代码

C++ 两个库依赖于相同的库但不同的版本?

c++ - GCC 模板问题

ios - OS X 上 OpenCL 的 CMakeListx.txt 文件

c - 从函数地址获取调用者函数名称

c - 链接器找不到对作为参数传递给 gcc 的 .a 库的引用

cmake - 如何将现有的源文件和头文件添加到 CLIon 项目

c++ - 编译器无法识别 std::vector 的成员初始值设定项