gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:38:36 25 4
gpt4 key购买 nike

我正在使用 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 方法来完成这个任务。

最好的问候!

最佳答案

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

不幸的是,没有更简洁的方法来做到这一点。你的已经很好了。我认为 CMake 试图在一切正常时提供方便,因此缓存,并在失败时试图强制您删除并重新生成它。

另一方面,您可以编写一个 CHECK_INCLUDE_FILE_CXX_ERROR 宏(或任何更清晰的名称)来包装您的 fatal 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)

关于c++ - 如何在 cmake 中检查给定的头文件是否可用于 C++ 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16485546/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com