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_directories
和include_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
是这些变量中的一个。
我正在尝试构建 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_directories
和include_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
是这些变量中的一个。