据我了解,CMake 获取
add_executable
(或 add_library
)中指定的所有源,并创建一个 makefile 目标来编译和链接每个源以创建生成的可执行文件(或库)。然而,我在网上看到,在 add_executable
/add_library
中指定标题是允许的,甚至有些鼓励!这让我感到惊讶,因为我的直觉告诉我,如果在那里指定了标头,它们将像常规源文件一样被编译和链接,这是错误的,...但不知何故它们不是;为什么?
CMake 是否检查提供的源的文件扩展名并过滤掉所有
.h
/.hh
/.hpp
/等?或者 CMake 是否检测并过滤掉其他源中 #include
的源?或者 CMake 是否有其他方法来知道哪些源应该或不应该编译?
例如,如何
add_executable(myprogram myprogram.cpp myprogram.hpp)
不是原因
g++ -c myprogram.hpp -o myprogram.hpp.o
?
我发现以下相关的SO讨论通常建议可以在
add_executable
/add_library
中指定标头,但他们没有回答为什么不编译标头:
为什么?
它们被明确忽略。因为cmake源码中有一个
if source is a header; then dont compile
。
CMake 是否检查提供源的文件扩展名并过滤掉所有 .h/.hh/.hpp/ 等?
是的
或者 CMake 是否检测并过滤掉其他源中 #include 的源?
没有。
或者 CMake 是否有其他方法来知道哪些源应该或不应该编译?
https://github.com/Kitware/CMake/blob/master/Modules/CMakeCCompiler.cmake.in#L47:
设置(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) 设置(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC)