我必须在我的 c++ 应用程序中使用一个丑陋的 C 库。在下面的解释中,我将它称为 UglyLib。我成功地将 UglyLib 编译为静态链接库。在文件ugly.h 中,UglyLib 使用了一个外部变量:
文件丑陋的.h:
extern SomeStruct_type somestruct;
该变量在另一个文件中定义(并且也使用)。我会称它为 anotherugly.c。
文件另一个ugly.c:
SomeStruct_type somestruct;
我的 c++ 应用程序基于通用模板库 (TemplateLib),应用程序本身由主窗口 GUI 代码和与主窗口代码静态链接的应用程序库组成。我将把这个静态链接库称为ApplicationLib。
TemplateLib 包含一个 templatelibfile.h,它使用 somestruct(UglyLib 公开的外部变量)导出函数 foo。
文件模板libfile.h:
#include<ugly.h>
...
void foo()
{
...
do something with somestruct
...
}
foo 函数由静态链接的 ApplicationLib 中包含的 appllibfile.h 使用。
文件 appllibfile.h:
#include<templatelibfile.h>
...
void applfoo()
{
...
foo();
...
}
主窗口应用程序包括 appllibfile.h
文件 main.cpp:
#include<appllibfile.h>
...
int main()
{
...
applfoo();
...
return 0;
}
在VS2008中,当我尝试编译主窗口应用程序时,微软链接器给了我这个错误
错误 LNK2001:无法解析的外部符号“struct SomeStruct_type somestruct”(?somestruct@@3USomeStruct_type@@A)
如果我在 templatefile.ha 中添加 extern 变量的新定义,编译器就会停止抱怨。
文件模板libfile.h:
#include<ugly.h>
SomeStruct_type somestruct
...
void foo()
{
...
do something with somestruct;
...
}
但我希望避免它,因为我不知道这是否是正确的做法(我不想冒险改变 UglyLib 重新定义 somestruct 变量的不同实例的语义)。您是否有一些建议可以避免链接问题而不重新定义 somestruct extern 变量?非常感谢!