【发布时间】:2021-03-17 07:09:00
【问题描述】:
我需要编写一个带有函数定义的汇编程序模块,并将其与我的 C++ 程序链接,其中是在汇编中实现的函数的声明。我不知道如何编写一个 C++ 文件和一个汇编程序模块来正确编译它。
我写了一个 C++ 文件
#include <iostream>
using namespace std;
void copy(unsigned int * source, unsigned int * dest, int n);
int main() {
unsigned int source[] = {1, 2, 3, 4};
unsigned int dest[4];
copy(source, dest, 4);
return 0;
}
然后我通过命令检查该函数的程序集名称:
g++ -masm=intel -S main.cpp -o file.asm
然后我将找到的结果插入到组装模块中
segment .text
global _Z4copyPjS_i@PLT
_Z4copyPjS_i@PLT:
ret
我想用汇编模块编译 cpp 文件(函数复制的实现在哪里)但我不知道该怎么做? 我试过了:
nasm -felf64 -o copy.o copy.asm
g++ main.cpp -o main.o
g++ -o main copy.o main.o
但是在第二个命令中,我得到一个错误:
/usr/bin/ld: tmp/ccWFOX8p.o: in function 'main':
main.cpp:(.text+0x4b): undefined reference to 'copy(unsigned int*, unsigned int*, int)'
collect2: error: ld returned 1 exit status
【问题讨论】:
-
最好在 C++ 代码中将函数声明为
extern "C"。这样你就不必处理名称修改了。 -
@Nesrine Hadj Khelil - 请不要将
code formatting用于 C++ 之类的名称。仅适用于您在 C++ 源代码中实际找到的文本,例如“return语句”。您的编辑不应该被批准;我认为你的意思是好的,但这实际上并不是一种改进。错误消息的引用而不是代码块也不是更好。 (这没有错,但不值得在编辑中更改,尤其是在没有其他需要修复的情况下。)
标签: c++ assembly g++ x86-64 nasm