9

我需要将我的程序与 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_HEADERS为空。message继续编译,直到出现上述错误。

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

4

2 回答 2

10

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

我通常更喜欢只使用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"
于 2013-09-15T10:23:49.140 回答
0

For anyone who has to work with CHECK_INCLUDE_FILES, the documentation lists a variable called CMAKE_REQUIRED_INCLUDES where you can set additional include paths apart from the default headers.

In a CMake file:

LIST(APPEND CMAKE_REQUIRED_INCLUDES "gssapi")

From the command line:

cmake . --DCMAKE_REQUIRED_INCLUDES="gssapi"

If all else fails, you can set the -I<dir> flag manually. However, this is not recommended as it not portable across compilers.

# note the extra space before `-I`
STRING(APPEND CMAKE_C_FLAGS " -Igssapi")
STRING(APPEND CMAKE_CXX_FLAGS " -Igssapi") # for C++

Also note that C++ headers have a different macro called CheckIncludeFileCXX.

于 2020-07-10T00:41:08.817 回答