gpt4 book ai didi

cmake - 如何在 cmake 中使用 CHECK_INCLUDE_FILES 宏?

转载 作者:行者123 更新时间:2023-12-04 11:39:11 27 4
gpt4 key购买 nike

我需要将我的程序与 Kerberos 身份验证库 ( gssapi_krb5 ) 链接起来,并使用相应的头文件 gssapi/gssapi.hgssapi/gssapi_krb5.h包含在源文件中。

目前,如果头文件不存在,编译将继续,并会因编译时错误提示未找到头文件而停止。
我想在cmake文件中实现的是检查头文件是否存在,如果没有找到就停止编译。

我将以下代码添加到我的 CMakeList.txt 中文件。

INCLUDE(CheckIncludeFiles)

CHECK_INCLUDE_FILES(gssapi/gssapi.h;gssapi/gssapi_krb5.h HAVE_KRB_HEADERS)
IF (NOT HAVE_KRB_HEADERS)
RETURN()
ENDIF (NOT HAVE_KRB_HEADERS)

但它仍然没有像我预期的那样运行。
我想要以下几行:
-- Looking for gssapi/gssapi.h - found
-- Looking for gssapi/gssapi_krb5.h - not found

但失败。
此外,变量 HAVE_KRB_HEADERSmessage 输出时为空宏。
编译继续,直到出现上述错误。

我在网上某处读到,这可能是因为 CMake 缓存。
我对 CMake 很陌生,对这个概念不太清楚。
我的 CMake 版本是 2.6。
我怎样才能使这段代码工作?谢谢!

最佳答案

我不能说我是 CheckIncludeFiles 的忠实粉丝因为它很难做对。原则上它很好 - 它实际上创建了很小的 c 文件,这些文件 #include请求的头文件并尝试编译它们,但似乎太容易出错了。

我通常更喜欢只使用 find_path 和/或 find_file 对于这份工作。这不会检查找到的任何文件的内容,但通常如果您找到所需的标题,则其内容很好!

我会用 find_path如果我需要知道标题所在的文件夹。这通常是因为我需要检查同一文件夹中的其他文件(如您的情况),或者更常见的是因为我需要将该文件夹添加到 include_directories 称呼。
find_file生成文件的完整路径(如果找到)。对于标题,通常我不需要 CMakeLists 中其他地方的路径 - 它只是在 find_file 之后立即使用检查文件是否实际找到。

所以,这就是我如何检查“gssapi/gssapi.h”和“gssapi/gssapi_krb5.h”

find_path(GssApiIncludes gssapi.h PATHS <list of folders you'd expect to find it in>)
if(NOT GssApiIncludes)
message(FATAL_ERROR "Can't find folder containing gssapi.h")
endif()

find_file(GssKrb gssapi_krb5.h PATHS ${GssApiIncludes} NO_DEFAULT_PATH)
if(NOT GssKrb)
message(FATAL_ERROR "Can't find gssapi_krb5.h in ${GssApiIncludes}")
endif()

如果你这样做,那么如果需要,你可以添加
include_directories(${GssApiIncludes})

这样在你的源代码中你就可以做到
#include "gssapi.h"
#include "gssapi_krb5.h"

关于cmake - 如何在 cmake 中使用 CHECK_INCLUDE_FILES 宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18808733/

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