Tak*_*ndo 5 c++ dependencies cmake include
我正在使用 C++ 和 cmake 开发我的应用程序。
我想检查每个 C++ 头文件是否正确包含所需的包含文件。
下面是一个例子:
一个.hpp
inline void func_a() {
}
Run Code Online (Sandbox Code Playgroud)
b.hpp
// #include "a.hpp" is missing
inline void func_b() {
func_a();
}
Run Code Online (Sandbox Code Playgroud)
主程序
#include "a.hpp"
#include "b.hpp"
int main() {}
Run Code Online (Sandbox Code Playgroud)
演示:https : //wandbox.org/permlink/kZqoNHMYARIB3bc1
b.hpp 应该包括 a.hpp。假设 b.hpp 缺少包括 a.hpp。如果 main.cpp 在 b.hpp 之前包含 a.hpp,则不会发生编译错误。如果包含顺序相反,则会发生编译错误。
我想检查一下这种问题。
我在 emacs 上使用 fly-check。它很好地检查了这个问题。我想在我的 cmake 构建系统中加入一些检查机制。
例如,如果我执行make depcheck,则检测到编译错误。
我认为如果我设置一个单独编译所有头文件但不链接的 cmake 目标,则会报告预期的编译错误。
到目前为止,我找不到如何设置它。
有没有办法做到这一点?或者其他方式来实现目标?
每个头文件都应该包含包含所需元素的头文件。换句话说,每个头文件都应该单独编译。
我想知道通过工具辅助自动检测 b.hpp 缺少`#include "a.hpp" 的方法。该工具意味着不是编辑器。我猜 cmake 可以做到这一点。我正在努力寻找方法。
@StoryTeller 的回答
传统的做法是将源文件添加到每个标头中。
是实现目标的适当方式。它需要添加许多源文件。这是一项烦人的工作,尤其是我开发了一个仅标头的库。
如何自动化该过程?
我找到了一种方法来检查 cmake 上缺少的包含文件。策略是单独直接编译每个头文件。
这是CMakeLists.txt
cmake_minimum_required(VERSION 3.8.2)
project(test_checker)
add_custom_target(chkdeps)
file(GLOB HDR_ROOT "*.hpp")
FOREACH (HDR ${HDR_ROOT})
message(STATUS "${HDR}")
get_filename_component(HDR_WE ${HDR} NAME_WE)
SET(CHK_TARGET "${HDR_WE}.chk")
add_custom_target(
${CHK_TARGET}
COMMAND ${CMAKE_CXX_COMPILER} -c ${HDR}
VERBATIM
)
add_dependencies(chkdeps ${CHK_TARGET})
ENDFOREACH ()
Run Code Online (Sandbox Code Playgroud)
要检查缺少的包含文件,请执行make chkdeps.
为了仅进行编译,我使用add_custom_target。自定义目标名称是chkdeps(检查依赖项)。这是所有头文件依赖性检查的目标。
我使用 获取 *.hpp 列表file(GLOB HDR_ROOT "*.hpp")。对于每个获取的文件,我添加自定义目标,仅使用add_custom_target进行编译。
我添加扩展名.chk以避免冲突。例如,如果文件名是,a.hpp则目标名称是a.chk.
${CMAKE_CXX_COMPILER}我执行带有选项的命令-c。该-c选项仅用于编译。我只在Linux上测试了cmake。我知道直接设置编译选项不利于跨平台开发。cmake 可能提供仅编译跨平台机制。但到目前为止我还没有找到它。
然后我chkdeps使用add_dependency添加依赖项。由于这种依赖性,当我执行时make chkdeps,所有自定义目标(a.chk和b.chk)都会运行。
当我运行时make chkdeps,我得到了预期的错误“'func_a'未在此范围内声明”,如下所示。
make chkdeps
Built target a.chk
/home/kondo/work/tmp/fly_check/b.hpp: In function 'void func_b()':
/home/kondo/work/tmp/fly_check/b.hpp:3:5: error: 'func_a' was not declared in this scope; did you mean 'func_b'?
3 | func_a();
| ^~~~~~
| func_b
make[3]: *** [CMakeFiles/b.chk.dir/build.make:57: CMakeFiles/b.chk] Error 1
make[2]: *** [CMakeFiles/Makefile2:78: CMakeFiles/b.chk.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2:113: CMakeFiles/chkdeps.dir/rule] Error 2
make: *** [Makefile:131: chkdeps] Error 2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
661 次 |
| 最近记录: |