CMake - 为什么 add_executable 中的标头未编译?

问题描述 投票:0回答:1

据我了解,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
1个回答
0
投票

为什么?

它们被明确忽略。因为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)

© www.soinside.com 2019 - 2024. All rights reserved.