gpt4 book ai didi

c++ - 如何让 CMake 检查我的 header 是否自给自足?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:25:16 26 4
gpt4 key购买 nike

设置

我有一个使用 CMake 构建和运行良好的项目。我的项目设置是这样的:

├── CMakeLists.txt
|
├── include/
│ └── standalone/
│ └── x.hpp
|
├── src/
└── standalone/
└── main.cpp

我的header的内容是这样的:

// ------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 在正确位置进行搜索的配置变量。即使对于正确的 header ,check_include_files()不起作用。 我需要做什么才能使这项工作正常进行?只有当正确的 header 被认为是正确的时,我才能继续测试不正确的 header 。

注意 除非它是绝对必要,我对直接调用 TRY_COMPILE 的 shell 脚本或详细的 CMake for 循环不感兴趣或类似的东西。 AFAICS,这就是 CheckIncludeFiles模块是为了,如果可能的话,我想知道如何正确配置它。

最佳答案

对于 C++ header 而不是 C header ,您需要使用 CheckIncludeFileCXX .此模块与 CheckIncludeFiles 的不同之处还在于您一次只能将一个文件传递给此宏。

也可能是您需要设置 CMAKE_REQUIRED_INCLUDES,或文档中列出的其他变量之一。

例如,如果您的某些 header 相互引用(如在 #include "h1.hpp" 中),则您需要:

set(CMAKE_REQUIRED_FLAGS ${CMAKE_CXX_FLAGS})
set(CMAKE_REQUIRED_INCLUDES ${CMAKE_SOURCE_DIR}/include)
include(CheckIncludeFileCXX)
foreach(project_header ${project_headers})
get_filename_component(header_name ${project_header} NAME_WE)
check_include_file_cxx("${project_header}" ${header_name}_IS_STANDALONE)
endforeach()

CMake wiki 文章 How To Write Platform Checks 中有更多信息.

关于c++ - 如何让 CMake 检查我的 header 是否自给自足?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16429376/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com