【问题标题】:Compile and link a header file with main() function using g++使用 g++ 编译和链接带有 main() 函数的头文件
【发布时间】:2015-09-02 16:05:48
【问题描述】:

当#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 中使用此解决方法,因此它相当轻松,因此我对进一步的解决方法不感兴趣,而是对我的实际问题的答案或者可能是解决方法不可避免的权威声明。

【问题讨论】:

  • 为什么你的标题中有main 函数?
  • 我不是权威,但您的“解决方法”似乎是编译程序的正常过程。
  • main 放入常规的 .cpp 其中 #includes 标题(这将是正确和理智的方式)不起作用 - 为什么?

标签: c++ gcc g++ precompiled-headers


【解决方案1】:

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

控制输出类型的选项

[...]

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

[...]

文件.h

C、C++、Objective-C或Objective-C++头文件转成 一个预编译的头文件(默认),或者要打开的 C、C++ 头文件 进入 Ada 规范(通过 -fdump-ada-spec 开关)。

[...]

文件.hpp

[...]

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

不过,这是一个有趣的想法,“a la Python”if __name__ == '__main__' idiom,将一些测试代码直接嵌入到在构建时通过 ENABLE_TESTING 宏激活的标头中。

【讨论】:

  • 是的,如果有什么东西已经在其他语言中广泛使用的话,这是一种范式,但我预计 C++ 类型会出现缺陷。有趣的是,这似乎是在 gcc 中硬编码的,在所有命令行开关中都没有解决方法。有人会认为您可以简单地说“即使这是一个 .xyz 文件,也可以认为它是一个 .whatever 文件。这不仅仅是一个有趣的想法,它还是有用的东西,我正在使用并将继续使用,并且在没有实现文件的头文件的上下文,现代 C++ 中非常常见的情况,它直接有益。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • stackoverflow 引用的情况不一样,因为他们这样做是偶然的。我将这种情况放在标题中是有原因的,并且正如问题所述,我这样做是故意的。
    • @user62177541 - 是的 - 问题不同。我给出了stackoverflow链接,因为那里的答案还解释说它将提供预编译的头文件而不是可执行文件。正如其他人已经提到的那样,最好的方法是将代码移动到 cpp 文件中。至少一个 cpp 文件,除了包含你的头文件之外什么都不做。
    猜你喜欢
    • 2022-01-26
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多