使用 g++ 编译并 link 带有 main() 函数的头文件

Compile and link a header file with main() function using g++

我有一个 .hpp 文件,当存在 #define 时,它​​包含一个 main() 函数。如果您必须知道,这是为了测试。因此,当我在启用此测试的情况下进行编译时,我需要生成一个可执行文件,但 g++ 似乎拒绝并且只会生成一个 "gch" 预编译头文件。检查了这个文件的二进制内容后,它的格式是前四个字节 "gpch" 然后是版本号,绝对不能在任何平台上执行。

我两次获取可执行文件的尝试如下:

g++ -DENABLE_TESTING -std=c++11 myheaderfile.hpp

g++ -DENABLE_TESTING -std=c++11 -o a.out myheaderfile.hpp

第一个生成 myheaderfile.hpp.gch,第二个生成完全相同的输出到 a.out。如上所述,这些文件不可执行。

所以我现在使用的解决方法是包含来自特殊用途和特别命名的 .cpp 文件的头文件,然后编译该文件而不是头文件,这样就可以了。我在 Makefile 中使用此解决方法,因此它相当轻松,因此我对进一步的解决方法不感兴趣,但对我的实际问题的回答或者可能是解决方法不可避免的权威声明。

G++ 是特定于扩展名的,并且根据文件扩展名做不同的事情。当您尝试在 g++ 中编译 hpp 文件时,它会创建所谓的预编译头文件。这个预编译的头文件是用来加速编译的。所以 g++ 正在做完全正确的事情。

话虽如此,您不应该一开始就将 main() 放入 .hpp 中。

编译头文件不会生成可执行文件,而是生成预编译头文件。

https://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html

另见 g++ output: file not recognized: File format not recognized

不幸的是,这行不通:g++ 的输出取决于文件后缀。它是硬编码的,期间。来自手册页:

Options Controlling the Kind of Output

[...]

For any given input file, the file name suffix determines what kind of compilation is done:

[...]

file.h

C, C++, Objective-C or Objective-C++ header file to be turned into a precompiled header (default), or C, C++ header file to be turned into an Ada spec (via the -fdump-ada-spec switch).

[...]

file.hpp

[...]

C++ header file to be turned into a precompiled header or Ada spec.

虽然 "a la Python" if __name__ == '__main__' 成语,但这是一个有趣的想法,将一些测试代码直接嵌入 header 中,该 header 将通过您的 [=17= 切换激活] 构建时的宏。