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

标签 c++ assembly header

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

最佳答案

您可以强制 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,但是为这种边缘情况增加的复杂性并不值得。)

关于c++ - 如何使用 g++ 获取 C++ 头文件 (.hpp) 的汇编代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12513665/

相关文章:

linux - 程序集 x86-64 从堆栈中获取函数参数

regex - 在 emacs 标题行中设置正则表达式

header - Objective-C++ 符号未发现奇怪的现象

c++ - 如何以 std::weak_ptr 作为键比较两个 std::map?

c++ - 如何使用 std::copy?不适用于 OSXSierra/CLION/C++11。

c++ - 为什么运行时库是编译器选项而不是链接器选项?

assembly - 比较汇编中的向量

c++ - 如何使用 OpenMP 通过 C++ std::list 并行化 for 循环?

c - 如何在 MIPS 汇编中初始化一个巨大的数组?

PHP 清理用户数据以用于 header() 函数