어셈블러로 작성된 라이브러리를 C++로 작성된 프로그램 코드와 컴파일 및 링크하는 데 문제가 있습니다. 제 경우에는 avr-gcc 제품군을 사용하는 AVR 마이크로 컨트롤러 용이지만이 문제는 일반적으로 GCC에 적용될 것이라고 생각합니다.GCC 링크/심볼 이름을 C++ 및 어셈블러 파일로 변환합니다.
I 수있는 C++ 소스와 어셈블리에서 내장 된 파일을 .o를 얻을 수 있지만 연결하면 오류 제공 : 동네 짱 - 간단한 Main.cpp
코드 여기
> 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()'
있어 :
#include "i2cmaster.h"
void main() {
i2c_init();
while (true) {
}
}
i2cmaster.h
이 정의를 함수 프로토 타입은 다음과 같습니다 :
extern void i2c_init(void);
그리고 어셈블리
.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
링킹은 생각할 필요도없는 것처럼 보일 수있을 것입니다 -하지만 난 그 참조 오류가 발생합니다 : 어 파일, i2cmaster.S
, 즉 기능입니다. 나는 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
심볼.
사람이 맹 글링 과정을 이해하고 컴파일/어셈블리 중에이 모듈이 서로 이야기 할 수 있도록 어떻게 억압하는가? 아니면 내가 잘못하고있는 다른 것?
왜 C++을 쓸 때 질문 C에 태그를 지정 했습니까? –
이 프로그램에서 C++ 기능을 사용하지 않으므로 C와 동일한 것으로 가정합니다. – QuadrupleA
그렇지 않습니다. C는 C++의 하위 집합이 아닙니다. –