使用g++编译并链接一个带有main()函数的头文件

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

本文关键字:main 函数 文件 一个 链接 g++ 使用 编译      更新时间:2023-10-16

我有一个.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.hp .gch,第二个生成与a.out完全相同的输出。如上所述,这些文件是不可执行的。

所以我现在使用的解决方案是包括头文件从一个特殊目的和特殊命名的。cpp文件,然后编译该文件而不是头,这是有效的。我在Makefile中使用这个解决方案,所以它相当轻松,因此我对进一步的解决方案不感兴趣,而是对我的实际问题的回答,或者可能是解决方案是不可避免的权威声明。

不幸的是,这不起作用:g++的输出依赖于文件后缀。它是硬编码的。从手册页:

控制输出类型的选项

[…]

对于任何给定的输入文件,文件名后缀决定了文件的类型编译完成:

[…]

file.h

转换成的C、c++、Objective-C或objective - c++头文件预编译的头文件(默认),或C、c++头文件转换为Ada规范(通过-fdump-ada-spec开关)。

[…]

file.hpp

[…]

将c++头文件转换为预编译头文件或Ada规范。

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

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

话虽如此,你不应该把main()放在。hpp开头。

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

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

参见g++输出:file not recognized:文件格式不被识别