AVR-GCC不链接c++与汇编函数
AVR-GCC Not Linking C++ with Assembly Function
我试图从c++调用一个汇编函数,并且链接器说我试图调用的函数不存在。下面是错误:
avr-gcc -mmcu=atmega328 -Wall -o main.elf hello.S main.cpp
/tmp/ccS7uaAX.o: In function `main':
main.cpp:(.text+0x14): undefined reference to `hello(char, char, char, char, char)'
collect2: error: ld returned 1 exit status
来源:
//Somewhere in hello.S
.global hello
hello:
ret
//In main.cpp
extern void hello(char, char, char, char, char);
int main(){
hello(1, 2, 3, 4, 5);
}
如果这有帮助,下面是我将这些文件编译成目标文件后的反汇编:
这里是main.o:
00000000 <main>:
0: 0f 93 push r16
2: cf 93 push r28
4: df 93 push r29
6: cd b7 in r28, 0x3d ; 61
8: de b7 in r29, 0x3e ; 62
a: 05 e0 ldi r16, 0x05 ; 5
c: 24 e0 ldi r18, 0x04 ; 4
e: 43 e0 ldi r20, 0x03 ; 3
10: 62 e0 ldi r22, 0x02 ; 2
12: 81 e0 ldi r24, 0x01 ; 1
14: 0e 94 00 00 call 0 ; 0x0 <main>
18: 80 e0 ldi r24, 0x00 ; 0
1a: 90 e0 ldi r25, 0x00 ; 0
1c: df 91 pop r29
1e: cf 91 pop r28
20: 0f 91 pop r16
22: 08 95 ret
这里是hello.o:
00000000 <hello>:
0: 08 95 ret
我已经找了几个小时了,我真的不知道发生了什么。
每个文件单独编译,我认为是链接搞砸了。
我也可以编译纯汇编没有任何问题。
任何帮助将不胜感激,我刚刚开始寻找混合汇编和c++的AVR。
试试这个:在main.cpp中,
extern "C" void hello(char, char, char, char, char);
中有一个"C"
。c++更改函数的名称以包含它的类型,这被称为名称mangling。"C"告诉编译器不要混淆。汇编器不会乱码,所以编译器需要知道不要乱码。
顺便说一下,混淆是链接器如何能够告诉您它正在寻找的hello
的参数类型。
编辑在当前对象文件上执行strings main.o |grep hello
,您将看到对hello的引用,后面有各种有趣的字符。
相关文章:
- 为什么 memcpy() 和其他类似的函数使用汇编?
- 英特尔汇编与内部函数,AVX
- 混合 c++ 和汇编不能将多个参数从C++函数传递到程序集
- 汇编错误:调用基本型构造函数时无效的转换
- C 汇编错误:无匹配的构造函数以进行初始化
- 如何在 x86 汇编中调用函数并将参数传递给它
- 在 GDB - C++ 中反汇编重载成员函数
- 内联函数如何编译为汇编?
- C 成员函数的汇编定义在班级主体之外
- 指示汇编时间叫什么构造函数
- 传递variadic arg to模板函数时的汇编误差
- 汇编函数调用是否会导致所有寄存器被推送到堆栈中
- 将C++内联汇编函数转换为delphi内联汇编函数
- C++向内联汇编函数传递参数
- 反汇编函数参数(无符号__int8)大海捞针[19] << 8)
- AVR-GCC不链接c++与汇编函数
- 从c++调用汇编函数
- 在c++ MinGW中包含汇编函数
- 如何从C++动态调用汇编函数
- visual MSVC汇编函数参数