使用g++编译并链接一个带有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.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:文件格式不被识别
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- "main"函数堆栈中的对象在第一个任务运行时被覆盖 (FreeRTOS)
- 为什么 'main' 函数中的局部 int 变量会自动初始化?
- 为什么在我的 main 函数中声明整数后我的整数数组中会出现错误?
- 尝试更改 main 函数内的全局变量值时出现编译错误 C++.
- 我应该在 main 函数中写什么来测试我的问题?
- 如何在 main 函数中输出两个新字符串C++?
- 有没有办法通过 main 函数访问受保护的矢量大小而无需将其转换为公共?
- 我们可以在main函数中声明嵌套类对象吗
- 为什么Main函数上的Sleep()会停止所有线程
- C++ main 函数中初始化静态变量
- 为什么VC++/MFC没有main函数?
- 如何在 main 函数的一个对象中初始化两个类的值?C++
- 在 C++ 中解析 main 函数的大量输入的正确方法是什么
- 如何编写一个 void 函数,该函数将在数组中搜索值,并通过引用将该值的位置传递回 main 函数
- 如何将矩阵参数发送到从C 中的MAIN函数
- 如何从子例程函数获取到 main 函数的返回值
- 为什么我不能在 main 函数中更改类的公共变量
- C++编译错误:多个定义"main",但项目中只有一个 main 函数
- 如何使用 x86 程序集在 c 中访问 main 函数中的变量