如何使用g++获取C++头文件(.hpp)的程序集代码
How can I use g++ to get assembly code for a C++ header (.hpp) file?
我有兴趣尝试查看头文件的汇编代码。使用一个带有伪主方法的简单.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.hp:
int number()
{
return 0;
}
我还在另一个名为struct.hpp:的hpp文件中试用它
struct Coord
{
int x;
int y;
};
两者都有相同的错误,但我希望能够看到两个标头的程序集,而无需将它们转换为.cpp文件(因为这破坏了标头文件的含义。)
您可以强制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
,但这种边缘情况增加的复杂性并不值得。)
相关文章:
- 内联程序集printf将整数解释为地址
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- 具有外部"c"和程序集的未定义函数
- 用于将C++代码转换为 Web 程序集的脚本未终止
- 为什么我的C++程序的程序集输出充满了 .ascii,没有汇编代码?
- CoreCLR 中的检测探查器 - 将帮助程序程序集加载到 dotnet 进程的方法
- 不同于按值传递和常量引用传递的程序集
- 为什么在堆栈和堆上创建变量会产生相同的程序集代码?
- C++变量在调用 x64 程序集函数后重置为 0
- 如何将C++子例程链接到 x86 程序集程序?
- Qt 网页程序集缓存
- 测试操作系统时执行程序集"sti"时虚拟框崩溃
- 为什么从 constexpr 引用生成的程序集代码与从 constexpr 指针生成的程序集代码不同?
- 将内联程序集尾调用函数尾声替换为用于x86/x64 msvc的Intrinsics
- 解析 C# 中的C++程序集
- 64 位进程中的 AnyCPU C# DLL 无法引用 64 位C++ DLL(给出错误:无法加载文件或程序集)
- 使用CLANG内联程序集创建C++预增量操作
- 是否可以在C++中基于程序集输出(.dll或.exe)定义变量
- 用于比较基元类型的std::可选的有趣程序集
- 如何使用g++获取C++头文件(.hpp)的程序集代码