CHECK_INCLUDE_FILE_CXX 在查找包含文件时不尊重 'target_include_directories'

CHECK_INCLUDE_FILE_CXX does not respect 'target_include_directories' when looking for include file

我正在尝试构建 simple-web-server using a local standalone copy of asios。由于我没有安装该库,而且由于安全限制我无法安装它,所以我稍微修改了 cmakelists 文件,告诉它在哪里搜索包含文件。我可以清楚地看到它正在找到位置,但是 CHECK_INCLUDE_FILE_CXX 出于某种原因没有找到它,即使我已经用 target_include_directories 添加了目录。正确的做法是什么?

if(USE_STANDALONE_ASIO)

### BEGIN CUSTOM ADDITIONS ###

    message(NOTICE "Searching for asio.hpp")
    find_path(ASIO_PATH asio.hpp ./asio/include) 
    if(ASIO_PATH-NOTFOUND)
        message(AUTHOR_WARNING "Asio not found in ./asio/include")
    else()
        message(NOTICE "asio.hpp found in ${ASIO_PATH}")
        target_include_directories(simple-web-server INTERFACE ASIO_PATH)
    endif()

### END CUSTOM ADDITIONS ###    

    find_package(Threads REQUIRED)
    target_link_libraries(simple-web-server INTERFACE ${CMAKE_THREAD_LIBS_INIT})
    
   target_include_directories
        target_compile_definitions(simple-web-server INTERFACE USE_STANDALONE_ASIO)
        include(CheckIncludeFileCXX)
        CHECK_INCLUDE_FILE_CXX(asio.hpp HAVE_ASIO)
        if(NOT HAVE_ASIO)
            message(FATAL_ERROR "Standalone Asio not found")
        endif()

命令target_include_directoriesinclude_directories影响编译,但不影响检查headers 通过 CHECK_INCLUDE_FILE_CXX.

为了提示宏 CHECK_INCLUDE_FILE_CXX 在其他包含目录中搜索,设置变量 CMAKE_REQUIRED_INCLUDES:

list(APPEND CMAKE_REQUIRED_INCLUDES ${ASIO_PATH})
...
CHECK_INCLUDE_FILE_CXX(asio.hpp HAVE_ASIO)

这个变量在documentation中有描述:

CMAKE_REQUIRED_INCLUDES

a list of header search paths to pass to the compiler.


在内部CHECK_INCLUDE_FILE_CXX执行编译时,它在其他CMake项目中编译(通过try_compile)。该其他项目不接收主项目的属性(如 INCLUDE_DIRECTORIES)。相反,一组特定的变量是从主项目显式传递的,CMAKE_REQUIRED_INCLUDES 是这些变量中的一个。