当#define存在时,我有一个包含main()函数的.hpp文件。如果您必须知道,这是用于测试。因此,当我正在编译启用此测试时,我需要生成一个可执行文件,但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中使用了这个变通方法,因此它相当轻松,因此我对进一步的变通方法不感兴趣,而是回答我的实际问题,或者可能是权威声明,解决方法是不可避免的。
答案 0 :(得分:0)
G ++是特定于扩展的,并根据文件扩展名做了不同的事情。当您尝试使用g ++编译hpp文件时,它会创建所谓的预编译头文件。此预编译头文件用于加速编译。所以g ++正在做正确的事情。
话虽如此,你不应该将main()放入.hpp开头。
答案 1 :(得分:0)
编译头文件不会生成可执行文件,而是生成预编译的头文件。
请参阅https://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html
另见g++ output: file not recognized: File format not recognized
答案 2 :(得分:0)
不幸的是,这不起作用:g ++的输出取决于文件后缀。这是硬编码的时期。从手册页:
控制输出类型的选项
[...]
对于任何给定的输入文件,文件名后缀决定了什么类型 编译完成:
[...]
file.h
要转换为C,C ++,Objective-C或Objective-C ++头文件 要转换的预编译头(默认)或C,C ++头文件 进入Ada规范(通过-fdump-ada-spec开关)。
[...]
file.hpp
[...]
将C ++头文件转换为预编译头或Ada规范。
这是一个有趣的想法,“一个Python”if __name__ == '__main__'
成语,将一些测试代码直接嵌入到标题中,该标题在构建时通过您的ENABLE_TESTING宏进行切换激活。