2011-08-02 4 views
1

gcc 4.2를 사용하여 Mac OS X에서 일부 기존 C/C++ 코드를 컴파일하려고합니다. 원래 Visual Studio를 사용하여 Windows에 작성되었습니다. 나는 다른 코드에 의해 링크되고있는 정적 라이브러리를 컴파일 중이지만 링커 오류를 이해하기가 어려웠다.gcc로 컴파일 된 정적 라이브러리의 해결되지 않은 기호

Undefined symbols for architecture i386: 
    "_read_float", referenced from: 
     _sub_token_values in libcompengine.a(alparce.o) 

메소드 read_float 라이브러리에 있으며 컴파일되고 :

내가 정적 라이브러리에 대한 일부 소스 코드를 컴파일하려고

링커는 나에게 다음과 같은 오류를 제공합니다. 나는 나노를 사용하여 라이브러리에서 기호를 덤프 때, 나는 볼이 libcompengine.a (alparce.o)로 정의되지 않은 나타납니다 _read_float 방법 미만 :

U _read_float 

그리고 더 아래 read_float이 있어야되는 파일에 정의 된 이름은 다음과 같습니다.

00000686 t __ZL10read_floatPKj 

이 방법이 올바르게 해석되지 않는 이유는 누구에게 들릴 수 있습니까? 나는 다양한 gcc 컴파일러와 소스 플래그를 사용하여 반나절을 보냈지 만, 불행히도, 나는 아직 우승 한 조합에 대해서는 언급하지 않았다.

답변

2

C와의 인터페이스에 C++ 라이브러리를 사용할 계획이라면 C 프로그램이 호출 할 함수를 적절하게 표시해야합니다.

내가 수행 한 (그 일을 다른 방법이 있기는하지만)

#ifndef INCLUDE_FILE_NAME_H 
#define INCLUDE_FILE_NAME_H 

// Insert this before any global function defintitions 
#ifdef __cplusplus 
extern "C" { 
#endif 

float read_float(); 

// Insert after all global function defintions 
#ifdef __cplusplus 
} 
#endif 
#endif 

이 컴파일러를 알려줍니다 어떤이가하는 것입니다 다음 그 통근자 "C"{} 사이의 외부 함수 정의의 모든 라인은 C 링키지를 사용해야합니다. C++로 컴파일 할 때 추가 정의 만 추가합니다. 또 다른 옵션은 아래와 같이 할 수 있습니다. 기본적으로 C 링키지를 사용해야하는 함수와 함수를 지정하는 함수를 지정할 수 있습니다.

#ifdef __cplusplus 
#define C_LINKAGE "C" 
#else 
#define C_LINKAGE 
#endif 

extern C_LINKAGE float read_float(); 
관련 문제