2012-04-05 1 views
3

Мне нужно использовать уродливую C-библиотеку внутри моего приложения на C++. В следующем объяснении я назову его UglyLib. Я успешно скомпилировал UglyLib как статически связанную библиотеку. В файле ugly.h UglyLib использует внешнюю переменную:сбой внешней ссылки в статической библиотеке

файл ugly.h:

extern SomeStruct_type somestruct; 

переменная определена (а также используется) в другом файле. Я назову это anotherugly.c.

файл anotherugly.c:

SomeStruct_type somestruct; 

Мое с ++ приложение основано на родовых библиотеке шаблонов (TemplateLib) и сам по себе состоит из основного кода окна GUI и на прикладных библиотеках статический связанные приложение с кодом главного окна. Я буду называть эту статически связанную библиотеку ApplicationLib.

TemplateLib содержит templatelibfile.h, который экспортирует функцию foo с использованием somestruct, внешней переменной, открытой UglyLib.

файл templatelibfile.h:

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

функция Foo используется appllibfile.h содержится в статически связанной ApplicationLib.

файл appllibfile.h:

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

Главное окно приложения включает в себя appllibfile.h

файл main.cpp:

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

В VS2008, когда я пытаюсь скомпилировать приложение основного окна, компоновщик microsoft дают мне эту ошибку

ошибка LNK2001: неразрешенный внешний символ "структура SomeStruct_type somestruct" (? Somestruct @@ 3USomeStruct_type @@)

Если добавить в templatefile.ha нового определения экстерна переменного компилятор перестает жаловаться.

файл templatelibfile.h:

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

НО Я хотел бы избежать этого, потому что я не знаю, если это правильно, что нужно сделать (я не хочу рисковать, чтобы изменить семантику UglyLib, переопределяющую другой экземпляр переменной somestruct). Есть ли у вас какие-либо предложения, чтобы избежать проблемы связывания без переопределения внешней переменной extern? Спасибо большое!

ответ

4

Возможно, это связано с тем, что компилятор C++ использует имя.Так как anotherugly.c является источником C (предположительно скомпилированным с компилятором C), символ somestruct будет отображаться без искажения. Когда вы компилируете остальные файлы с помощью компилятора C++, компоновщик ищет искаженное имя, которого не существует.

Я думаю, что окружающая декларация в ugly.h в extern "C" может решить проблему.

+0

Большое спасибо, он отлично работает! –

+0

@GuidoRanzuglia: вы должны принять ответ, нажав на галочку слева. –