2

我有兴趣尝试查看我的头文件的汇编代码。使用虚拟 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 文件的情况下查看两个头文件的程序集(因为这破坏了头文件的含义。)

4

1 回答 1

6

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

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

您收到“两次指定输出文件名”消息的原因是,当将头文件传递给 gcc 时,它会假定您要将其编译成预编译的头文件。就像命名一样,这将“编译”标题,因此将在中间生成一个 *.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,但是这种边缘情况增加的复杂性并不值得。)

于 2012-09-20T13:32:49.777 回答