【发布时间】:2013-05-07 22:08:49
【问题描述】:
设置
我有一个使用 CMake 构建和运行良好的项目。我的项目设置是这样的:
├── CMakeLists.txt
|
├── include/
│ └── standalone/
│ └── x.hpp
|
├── src/
└── standalone/
└── main.cpp
我的头文件内容是这样的:
// ------x.hpp--------
#pragma once
#include <iostream>
class X
{
public:
void hello()
{
std::cout << "Hello World!\n"; // needs <iostream>
}
};
// -------main.cpp-------
#include <standalone/x.hpp>
int main()
{
X x;
x.hello();
}
我用下面CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(standalone)
###############################################################
# Compiler settings
###############################################################
# use C++11 features
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
# set warning level
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -pedantic -pedantic-errors -Wall -Wextra")
###############################################################
# header dependencies
###############################################################
# compile against project headers
include_directories(${PROJECT_SOURCE_DIR}/include)
# the header files
file(GLOB_RECURSE header_files FOLLOW_SYMLINKS "include/*.hpp")
# the source files
file(GLOB_RECURSE source_files FOLLOW_SYMLINKS "src/*.cpp")
###############################################################
# build target
###############################################################
# the program depends on the header files and the source files
add_executable(main ${header_files} ${source_files})
mkdir build、cd build、cmake ..、make 和 ./main 的命令序列正确打印“Hello World!”没有警告。
问题
上面的设置是正确的。但是假设<iostream> 不包含在x.hpp 中,而是包含在main.cpp 中。然后程序仍然可以正确构建,但x.hpp 不会是独立的标头。所以我想测试self-sufficiency of my headers,即对于每个头我想编译一个小测试程序
#include "some_header.hpp"
int main() {}
但是,如果我将以下部分添加到 CMakeList.txt
###############################################################
# header self-sufficiency
###############################################################
set(CMAKE_REQUIRED_FLAGS ${CMAKE_CXX_FLAGS})
message("REQUIRED_FLAGS=${CMAKE_REQUIRED_FLAGS}")
set(CMAKE_REQUIRED_INCLUDES ${CMAKE_SOURCE_DIR}/include)
message("REQUIRED_INCLUDES=${CMAKE_REQUIRED_INCLUDES}")
include(CheckIncludeFiles)
check_include_files("${header_files}" IS_STANDALONE)
宏${header_files} 正确扩展为标题x.hpp,但check_include_files() 命令没有正确编译它
REQUIRED_FLAGS= -std=c++11 -Werror -pedantic -pedantic-errors -Wall -Wextra
REQUIRED_INCLUDES=/home/rein/projects/standalone/include
-- Looking for include file /home/rein/projects/standalone/include/standalone/x.hpp
-- Looking for include file /home/rein/projects/standalone/include/standalone/x.hpp - not found.
问题
显然我缺少一些配置变量,让 CMake 在正确的位置进行搜索。即使对于正确的标题,check_include_files() 也不起作用。 我需要做些什么来完成这项工作?只有当正确的标题被认为是正确的,我才能继续测试不正确的标题。
注意除非是
绝对必要,我对直接调用TRY_COMPILE 的shell 脚本或精心制作的CMake 循环不感兴趣或类似的东西。 AFAICS,这就是 CheckIncludeFiles 模块的用途,如果可能的话,我想知道如何正确配置它。
【问题讨论】:
-
这个answer 到关于Self-sufficient headers in C/C++ 的问题有一个脚本
chkhdr,可用于测试标头的自包含性。 -
@JonathanLeffler 谢谢,是的,我知道您的脚本,并将检查它(同时我找到了另一个脚本,请参阅我的答案)。令人失望的是,CMake 并不简单(我试图保持与 Windows 兼容)。
-
我没有将它作为答案发布的一个原因是我不确定如何将它集成到 CMake 中。抱歉,我帮不上忙。
-
@JonathanLeffler 没问题,本周早些时候我已经对你的优秀剧本投了赞成票 :-)
标签: c++ cmake header-files buildconfiguration build-dependencies