如何使用 g++ 获取 C++ 头文件 (.hpp) 的汇编代码?

Posted

技术标签:

【中文标题】如何使用 g++ 获取 C++ 头文件 (.hpp) 的汇编代码?【英文标题】:How can I use g++ to get assembly code for a C++ header (.hpp) file? 【发布时间】:2012-09-20 13:27:27 【问题描述】:

我有兴趣尝试查看我的头文件的汇编代码。用一个虚拟的 main 方法玩一个简单的 .cpp 文件并编译它很容易:g++ -S -o prog.exe main.cpp

但是,我现在要进入头文件。我有一个虚拟头文件func.hpp,它只包含一个虚拟方法,现在我希望能够编译它并在.S 文件中查看它的程序集。 (这样做的主要原因是如果我有一个更复杂的功能,也许我可以在汇编中进行一些手动优化,然后通过g++ -o prog.exe func.S main.cpp构建最终的可执行文件。

但是,我无法找到解释这一点的来源。如果我尝试g++ -S -o func.S func.hpp,我会收到一条错误消息output filename specified twice。谁能帮我解决这个问题?

供参考,这里是func.hpp:

int number()

    return 0;

我也在尝试使用另一个名为 struct.hpp 的 hpp 文件:

struct Coord

    int x;
    int y;
;

两者的错误相同,但我希望能够在不将它们转换为 .cpp 文件的情况下查看两个头文件的程序集(因为这会破坏头文件的含义。)

【问题讨论】:

如果您创建一个 .cpp 文件,它什么都不做,但标题为 #include,然后在上面运行 g++ -S,它会开始工作吗? 事实上,确实如此。太漂亮了,谢谢! 【参考方案1】:

您可以强制 g++ 将 .hpp 文件视为 C++ 源文件。

g++ -x c++ -S -o func.S func.hpp

您收到“输出文件名指定两次”消息的原因是,当将头文件传递给 gcc 时,它会假定您要将其编译为 pre-compiled header。就像命名一样,这将“编译”标题,因此将在中间生成一个 *.s 文件。如果您在原始命令中传递-v 标志,您将看到 cc1plus 的调用如下:

 /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.1/cc1plus
     -quiet
     -v 
     -D_GNU_SOURCE 
     func.hpp
     -quiet 
     -dumpbase func.hpp 
     -mtune=generic 
     -march=x86-64 
     -auxbase-strip func.S
     -version 
     -o func.S                # <---
     -o /tmp/ccxEg3J7.s       # <---
     --output-pch= func.S

所以确实-o 被指定了两次,一次来自您的-o,一次来自编译器。

(当然编译器可以避免添加-o /tmp/ccxEg3J7.s,但是这种边缘情况增加的复杂性并不值得。)

【讨论】:

没错。否则,它认为您要求它创建一个预编译的头文件,因此它的行为就像您指定了-x c++-header。我认为这个问题仍然表明 g++ 如何为头文件生成 cc1plus 命令存在错误,但至少有一个解决方法。

以上是关于如何使用 g++ 获取 C++ 头文件 (.hpp) 的汇编代码?的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用 CMake 构建时列出 .hpp 头文件

如何在 C++ 的头文件中定义字符串数组并设置其值?

创建新的 C++ 类时如何使 XCode 使用 .hpp 标头而不是 .h?

C++:命名空间——如何在头文件和源文件中正确使用?

在 C++ 中使用双包含守卫

找不到opencv相关的头文件stitcher.hpp