我有兴趣查看我的头文件的汇编代码。使用虚拟 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/