Мне нужно использовать уродливую 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? Спасибо большое!
Большое спасибо, он отлично работает! –
@GuidoRanzuglia: вы должны принять ответ, нажав на галочку слева. –