如何在cmake中检查给定的头文件是否可用于c++项目

How to check in cmake whether a given header file is available for C++ project

本文关键字:是否 文件 用于 项目 c++ cmake 检查      更新时间:2023-10-16

我使用cmake来管理我的项目编译,这是我第一次使用cmake。这个工具非常方便,因为有大量的脚本和函数可以检查是否在给定的计算机上安装了所有必要的库。然而,有时,这些通用脚本不涵盖某些特定情况,或者对于给定的库根本不可用。我的问题是:

判断给定头文件(hpp或h)是否在包含路径中可用的正确cmake样式方法是什么?

的理由:最直接的方法可能是使用CHECK_INCLUDE_FILE宏。例如,如果我想使用unittest++库,我可以写

CHECK_INCLUDE_FILE_CXX("UnitTest++.h" HAVE_UNITTESTXX)
IF(NOT HAVE_UNITTESTXX)
  message( FATAL_ERROR "UnitTest++ is not found" )
ENDIF()

不幸的是,如果这样做,变量HAVE_UNITTESTXX存储在缓存中。如果我在我的系统中安装了unittest++库,cmake仍然会抱怨没有安装unittest++ .h。我可以手动删除缓存,但标准的查找包函数不需要这样做。我还可以像这样升级代码

CHECK_INCLUDE_FILE_CXX("UnitTest++.h" HAVE_UNITTESTXX)
IF(NOT HAVE_UNITTESTXX)
  UNSET(HAVE_UNITTESTXX CACHE)
  message( FATAL_ERROR "UnitTest++ is not found" )
ENDIF()

这个解决方案可以工作,但是看起来不太好。我想知道做这项工作的一种可行方法。

致以最亲切的问候!

您正在寻找的答案已经在CMake Wiki上了。他们清楚地告诉你要手动删除文件CMakeCache.txt或缓存行。

不幸的是,没有更干净的方法来做到这一点。你的已经是最好的了。我认为CMake试图方便当一切都是正确的,因此缓存,并试图强迫你删除和重新生成它,当你失败。

另一方面,您可以编写一个CHECK_INCLUDE_FILE_CXX_ERROR宏(或任何更简洁的名称)来包装您的致命错误消息,这样您就不必每次都重复相同的代码:

macro(CHECK_INCLUDE_FILE_CXX_ERROR INCLUDE_FILE HAVE_FILE)
    CHECK_INCLUDE_FILE_CXX(${INCLUDE_FILE} ${HAVE_FILE})
    IF(NOT ${HAVE_FILE})
        UNSET(HAVE_UNITTESTXX CACHE)
        message( FATAL_ERROR "${INCLUDE_FILE} is not found" )
    ENDIF()
endmacro()

然后像这样使用:

CHECK_INCLUDE_FILE_CXX_ERROR("UnitTest++.h" HAVE_UNITTESTXX)
相关文章: