如何在cmake中使用CHECK_INCLUDE_FILES宏?

Sum*_*Tea 6 cmake

我需要将我的程序与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)
Run Code Online (Sandbox Code Playgroud)

但它仍然没有按照我的预期行事.我想要以下几行:

-- Looking for gssapi/gssapi.h - found
-- Looking for gssapi/gssapi_krb5.h - not found
Run Code Online (Sandbox Code Playgroud)

但失败了.此外,HAVE_KRB_HEADERS使用message宏输出时变量为空.编译继续,直到发生上述错误.

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

Fra*_*ser 7

我不能说我是一个巨大的粉丝,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()
Run Code Online (Sandbox Code Playgroud)

如果你这样做,那么如果需要你可以添加

include_directories(${GssApiIncludes})
Run Code Online (Sandbox Code Playgroud)

所以在你的源代码中你可以做到

#include "gssapi.h"
#include "gssapi_krb5.h"
Run Code Online (Sandbox Code Playgroud)