gpt4 book ai didi

c++ - GCC 链接/符号名称与 C++ 和汇编程序文件的混淆

转载 作者:行者123 更新时间:2023-11-30 01:59:26 27 4
gpt4 key购买 nike

我在编译和链接一个用汇编程序编写的库与我的 C++ 程序代码时遇到了一些问题。在我的例子中,它适用于使用 avr-gcc 套件的 AVR 微 Controller ,但我想这个问题通常适用于 GCC。

我可以获得从 C++ 源代码和程序集构建的 .o 文件,但链接它们会出现错误:

> avr-gcc -mmcu=attiny84 -lm -o obj\AvrTest.elf obj\Main.o obj\i2cmaster.o
obj\Main.o: In function `main':
Main.cpp:(.text+0x0): undefined reference to `i2c_init()'

这是 super 简单的 Main.cpp 代码:

#include "i2cmaster.h"
void main() {
i2c_init();
while ( true ) {
}
}

i2cmaster.h 定义函数原型(prototype)如下:

extern void i2c_init(void);

在汇编文件i2cmaster.S中,函数是:

.global i2c_init
.func i2c_init
i2c_init:
cbi SDA_DDR,SDA ;release SDA
cbi SCL_DDR,SCL ;release SCL
cbi SDA_OUT,SDA
cbi SCL_OUT,SCL
ret
.endfunc

链接看起来很简单 - 但我遇到了引用错误。我注意到为 Main.cpp 生成的汇编代码是这样的:

.global main
.type main, @function
main:
rcall _Z8i2c_initv
.L2:
rjmp .L2
.size main, .-main

我怀疑问题是 i2c_init 正在通过一些我不理解的名称修改过程变成 _Z8i2c_initv,而 _Z8i2c_initv 不能不再与 i2cmaster.o 目标文件中的未损坏的 i2c_init 符号匹配。

有没有人了解 mangling 过程,以及如何在编译/汇编期间抑制它以便这些模块可以相互通信?或者我可能做错了什么?

最佳答案

好的,解决了。显然,符号重整是 C++ 的事情,并且 i2c 库没有设置为与 C++ 一起正确工作。能够使用以下方法修复它:

extern "C" {
#include "i2cmaster.h"
};
void main() {
i2c_init();
while ( true ) {
}
}

关于c++ - GCC 链接/符号名称与 C++ 和汇编程序文件的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16270732/

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