2014-05-11 3 views
0

확장자가 .o 인 두 개의 프로그램을 연결하려고 할 때 컴파일러가 "012s"과 그 밖의 다른 내용을 이해하지 못합니다.연결시 정의되지 않은 참조 오류가 발생했습니다.

은 그 명령을 Cygwin 터미널에서 이러한 프로그램을 사용하고 있습니다 :

gcc -o file file1.o file2.o 

내가 같은 math.h가 (그래서 -lm 필요)를 포함하는 다른 라이브러리를 필요가 없습니다.

헤더 파일에는 두 가지 기능 만 있으며 필자는이를 주 프로그램에 포함 시켰습니다. 링커가 모두 올바른 연결을 할 수 있도록 서로를 참조하는 객체의 경우

file1.o:file1.c(.text+0x2a): undefined reference to `Function1' 
file1.o:file1.c:(.text+0x104): undefined reference to `Function2' 
/usr/lib/gcc/i686-pc-cygwin/4.7.3/../../../../i686-pc-cygwin/bin/ld: file1.o: bad reloc address 0x20 in section `.eh_frame' 
/usr/lib/gcc/i686-pc-cygwin/4.7.3/../../../../i686-pc-cygwin/bin/ld: final link failed: Invalid operation 
collect2: error: ld returned 1 exit status 
+1

코드를 보지 않고도 문제를 진단하기가 어려울 것입니다. 관련 코드를 게시 할 수 있습니까? –

+0

조금 길지만 시도해 보겠습니다 ... : – user3476125

+0

서로 참조하고 있습니까? 때로는 .o 파일을 링크 경로에 두 번 이상 추가해야합니다. – Jiminion

답변

0

, 때로는 한 번 이상 경로에 포함해야합니다

은 내가이 얻을.

gcc -o file file1.o file2.o file1.o file2.o 
0

오류는 Function1 또는 Function2을 찾을 수 없습니다 file1.o에 대한 외부 참조를 만족시키기 위해 노력하고 링커에 의해 생성 페이지의 "undefined reference"오류가 발생합니다. 파일이 중요 링크에 대해 제공되는 객체 순서있는

gcc -o file file2.o file1.o 

참고 : 가정에서 그 기호는 file2.o에 있는지 간단한 솔루션은 그렇게 file2.o가 먼저 연결됩니다 보장 할 것이다. 물론 file2.ofile1.o에있는 기호가 필요한 경우 순환 종속성의 동일한 문제로 되돌아갑니다.

gcc -o file file1.o file2.o file1.o 

이 접근하지 않는 :

당신이 순환 종속성을 제거 할 수없는 경우에는 자주 사용되는 "해킹은"예를 들어, 링크 명령에 두 번 이상 오브젝트 파일을 포함하는 것입니다 그러나 대규모 솔루션으로 확장 할 수 있습니다. 당신이 이상적으로 원하는 것은 필요한 심볼을위한 목적 파일의 "가방"을 통해 링크를 검색하는 것입니다. 이 동작은 개체 파일이 포함 된 보관 파일을 사용하여 수행 할 수 있습니다. GNU 링커는 최소한 아카이브의 파일을 검색하여 심볼을 분석하려고 시도합니다. 따라서 :

ar cr libfiles.a file1.o file2.o 

gcc -o file libfiles.a file1.o file2.o 
관련 문제