2013-04-29 2 views
1

어셈블러로 작성된 라이브러리를 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 심볼.

사람이 맹 글링 과정을 이해하고 컴파일/어셈블리 중에이 모듈이 서로 이야기 할 수 있도록 어떻게 억압하는가? 아니면 내가 잘못하고있는 다른 것?

답변

4

정상적으로 해결되었습니다. 명백하게 심볼 맹 글링은 C++ 일이며, i2c 라이브러리는 C++로 올바르게 작동하도록 설정되지 않았습니다. 다음을 사용하여 문제를 해결할 수있었습니다.

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

왜 C++을 쓸 때 질문 C에 태그를 지정 했습니까? –

+0

이 프로그램에서 C++ 기능을 사용하지 않으므로 C와 동일한 것으로 가정합니다. – QuadrupleA

+0

그렇지 않습니다. C는 C++의 하위 집합이 아닙니다. –