CMake中add_executable为何不编译指定的头文件?
为什么CMake中add_executable指定头文件不会被编译?
CMake判断一个文件是否需要被编译成目标文件,核心依据是文件的扩展名,而非是否被其他源文件#include。
CMake内置了一套文件扩展名与编译规则的映射:
- 像
.cpp、.c、.cxx这类源文件扩展名,会被识别为需要编译的文件,触发对应的编译器命令(比如g++ -c xxx.cpp -o xxx.o)。 - 而
.h、.hh、.hpp、.hxx这类头文件扩展名,CMake默认不会将其视为需要单独编译的源文件,自然不会生成对应的编译命令。
- 像
官方允许甚至建议在
add_executable/add_library里指定头文件的原因:
主要是为了让头文件能被IDE(比如CLion、VS)识别,在项目视图里正常显示;同时打包发布项目时,头文件也会被包含到目标输出中,方便后续的开发或分发。
举你提到的例子:
add_executable(myprogram myprogram.cpp myprogram.hpp)
CMake只会对myprogram.cpp生成编译命令,myprogram.hpp因为扩展名是.hpp,会被跳过编译步骤,不会出现g++ -c myprogram.hpp -o myprogram.hpp.o这样的命令。
补充:如果强行修改CMake规则让头文件被编译,反而会引发错误——因为头文件本身是为了被#include到源文件中,单独编译会因为缺少主函数、重复定义等问题失败。
内容的提问来源于stack exchange,提问作者DBear
相关产品推荐
相关产品推荐

