GCC链接/符号名与C ++和汇编文件压延(GCC linking / symbol name ma

2019-09-01 08:28发布

我有一些麻烦,编译和链接形式,它在汇编与我的程序代码,这是在C ++库。 在我的情况下,它使用GCC编译套件的AVR单片机,但我想这个问题也适用于一般GCC。

我能得到的.o从C ++源代码和汇编建文件,但将它们连接提供了错误:

> 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()'

这里的尤伯杯简单Main.cpp代码:

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

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

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可以不再与非错位匹配i2c_init中符号i2cmaster.o目标文件。

有谁知道是混淆的过程,以及如何编译/装配过程中抑制它,这样这些模块可以互相交谈? 或其他任何东西我可能是做错了?

Answer 1:

OK,解决了这个问题。 显然,符号重整是一个C ++的东西,并且I2C库未设置与C ++正常工作。 之所以能够通过使用以下来解决它:

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


文章来源: GCC linking / symbol name mangling with C++ and assembler files