gpt4 book ai didi

c++ - 使用 g++ 链接程序集和 C++ 时 undefined reference

转载 作者:搜寻专家 更新时间:2023-10-31 01:54:55 27 4
gpt4 key购买 nike

我必须在 Assembly 中编写一个类的一些成员函数以备考试。我已按照每条说明进行操作,但仍然无法正常工作。这是相关文件。 header 和 main 方法已经提供了,我只需要编写构造函数和 elab1 方法即可。

类头

#include <iostream>
using namespace std;
struct st { int a; int vv1[4]; double vv2[4]; };
class cl
{ double b; st s;
public:
cl(int *p, double *d);
void elab1(st ss);
void stampa()
{ int i; cout << b << ' ' << s.a << endl;
for (i=0;i<4;i++) cout << s.vv1[i] << ' '; cout << '\t';
for (i=0;i<4;i++) cout << s.vv2[i] << ' '; cout << endl;
cout << endl;
}
};

主要测试方法

// prova1.cpp
#include "cc.h" // class header
int main()
{
st s = {1, 1,2,3,4, 1,2,3,4 };
int v[4] = {10,11,12,13 };
double d[4] = { 2, 3, 4, 5 };
cl cc1(v, d);
cc1.stampa();
cc1.elab1(s);
cc1.stampa();
}

这是我的程序集:

# es1.s
.text
.global __ZN2clC1EPiPe

__ZN2clC1EPiPe:

pushl %ebp
movl %esp, %ebp
subl $4, %esp

pushl %eax
pushl %ebx
pushl %ecx
pushl %edx
pushl %esi

cmpl $0, 12(%ebp)
je fine
cmpl $0, 16(%ebp)
je fine

movl 8(%ebp), %eax
movl 12(%ebp), %ebx
movl 4(%ebx), %ecx
movl %ecx, 12(%eax)

fldz
fstpl (%eax)

movl $0, -4(%ebp)

ciclo:

cmpl $4, -4(%ebp)
je fine

movl -4(%ebp), %esi
movl 12(%ebp), %ebx
movl (%ebx, %esi, 4), %ecx
subl %esi, %ecx
movl %ecx, 16(%eax, %esi, 4)

movl 16(%ebp), %ebx
pushl %eax
movl %esi, %eax
movl $3, %ecx
imull %ecx
movl %eax, %edx
popl %eax

movl 12(%ebp), %ecx

fldl (%ebx, %edx, 4)
fldl (%ecx, %esi, 4)
faddp %st, %st(1)

fstpl 32(%eax, %edx, 4)

fldl (%ebx, %edx, 4)
fldl (%eax)
faddp %st, %st(1)

fstpl (%eax)

incl -4(%ebp)
jmp ciclo

fine:

popl %esi
popl %edx
popl %ecx
popl %ebx
popl %eax

movl 8(%ebp), %eax

leave
ret

.global __ZN2cl5elab1E2st

__ZN2cl5elab1E2st: #TODO

我尝试使用提供给我们的命令行语句编译和链接所有内容:

g++ -o es1 -fno-elide-constructors es1.s prova1.cpp

但它只给了我一堆undefined reference:

/tmp/ccbwS0uN.o: In function `main':
prova1.cpp:(.text+0xee): undefined reference to `cl::cl(int*, double*)'
prova1.cpp:(.text+0x192): undefined reference to `cl::elab1(st)'
collect2: ld returned 1 exit status

你知道我该如何解决这个问题吗?我想可能是我翻译错了函数名,但我已经检查了好几次。

最佳答案

c++filt 应用到您的名称修改中,并与错误消息中的签名进行比较。

当删除一个下划线并使用 c++filt 进行过滤时,我得到了你的错误名称 cl::cl(int*, long double*),它与你的错误消息中的任何内容都不匹配/类声明。

对于 cl::cl(int*, double*),正确的名称应该是 _ZN2clC1EPiPd

我建议您改进(无论是什么)获取损坏名称的方式。

关于c++ - 使用 g++ 链接程序集和 C++ 时 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9001904/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com