2012-04-05 2 views
3

내 C++ 응용 프로그램에서 추한 C 라이브러리를 사용해야합니다. 다음 설명에서는 UglyLib이라고 부릅니다. 정적으로 링크 된 라이브러리로 UglyLib을 성공적으로 컴파일했습니다. UglyLib ugly.h 파일에 은 통근 변수를 사용정적 라이브러리 내에서 extern variable linking failure

파일 ugly.h (사용과 같은)

extern SomeStruct_type somestruct; 

변수가 정의되는 다른 파일이다. 나는 그것을 anotherugly.c라고 부를 것이다.

파일 anotherugly.c :

SomeStruct_type somestruct; 
내 C++ 응용 프로그램 고유의 템플릿 라이브러리 (TemplateLib) 및 응용 프로그램 자체 메인 윈도우의 GUI 코드에 의해 정적으로 링크 된 응용 프로그램 라이브러리로 구성되어 기반으로

메인 윈도우 코드. 이 정적 링크 된 라이브러리 인 ApplicationLib이라고 부릅니다.

TemplateLib에는 somestruct, 즉 UglyLib에 의해 노출 된 extern 변수를 사용하여 foo라는 함수를 내 보냅니다 templatelibfile.h가 포함되어 있습니다.

파일 templatelibfile.h :

#include<ugly.h> 
... 
void foo() 
{ 
... 
do something with somestruct 
... 
} 

푸 기능은 정적으로 링크 ApplicationLib에 포함 appllibfile.h에 의해 사용된다.

파일 appllibfile.h은 : VS2008에서

#include<appllibfile.h> 
... 
int main() 
{ 
... 
applfoo(); 
... 
return 0; 
} 

내가 컴파일하려고 :

#include<templatelibfile.h> 
... 
void applfoo() 
{ 
... 
foo(); 
... 
} 

메인 윈도우 응용 프로그램 appllibfile.h

파일 MAIN.CPP을 포함 메인 윈도우 응용 프로그램, 마이크로 소프트 링커가 내게이 오류를 준다

오류 LNK2001 : 나는 통근 변수의 templatefile.ha 새로운 정의에 추가하는 경우 확인되지 않은 외부 기호는 "구조체 SomeStruct_type somestruct"(? somestruct @@ 3USomeStruct_type @@ A)

는 컴파일러에 정지 불평.

파일 templatelibfile.h :

#include<ugly.h> 
SomeStruct_type somestruct 
... 
void foo() 
{ 
... 
do something with somestruct; 
... 
} 

하지만 내가 그것을 할 수있는 올바른 것 (I가 위험을 감수하지 않으려 인 경우 내가 모르기 때문에 그것을 피하고자하는 것 somestruct 변수의 다른 인스턴스를 다시 정의하는 UglyLib의 의미 체계 변경). somestruct extern 변수를 재정의하지 않고 링크 문제를 피하기 위해 몇 가지 제안 사항이 있습니까? 감사합니다.

답변

4

이것은 아마도 C++ 컴파일러가 수행하는 이름 - 맹 글링 때문일 수 있습니다.anotherugly.c은 C 소스 (아마도 C 컴파일러로 컴파일 됨)이므로 심볼 somestruct은 맹 글링되지 않고 노출됩니다. C++ 컴파일러로 파일의 나머지를 컴파일하면 링커는 존재하지 않는 맹 글링 된 이름을 찾습니다.

extern "C"ugly.h의 선언을 둘러싸면 문제가 해결 될 수 있다고 생각합니다.

+0

고마워요. 완벽하게 작동합니다. –

+0

@GuidoRanzuglia : 왼쪽 눈금을 클릭하여 답을 수락해야합니다. –