静态库中的外部变量链接失败

时间:2012-04-05 08:18:31

标签: c++ c static-linking

我必须在我的c ++应用程序中使用一个丑陋的C库。在下面的解释中,我将其称为UglyLib。我成功地将UglyLib编译为静态链接库。 在ugly.h文件中,UglyLib使用extern变量:

文件ugly.h:

extern SomeStruct_type somestruct;

该变量在另一个文件中定义(也可以使用)。我会把它叫做另一个。

file anotherugly.c:

SomeStruct_type somestruct;

我的c ++应用程序基于通用模板库(TemplateLib),应用程序本身由主窗口GUI代码和静态链接到主窗口代码的应用程序库组成。我将调用这个静态链接的库ApplicationLib。

TemplateLib包含一个templatelibfile.h,它使用somestruct导出函数foo,这是由UglyLib公开的extern变量。

file templatelibfile.h:

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

foo函数由静态链接的ApplicationLib中包含的appllibfile.h使用。

file appllibfile.h:

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

主窗口应用程序包括appllibfile.h

文件main.cpp:

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

在VS2008中,当我尝试编译主窗口应用程序时,microsoft链接器给我这个错误

  

错误LNK2001:未解析的外部符号“struct SomeStruct_type somestruct”(?somestruct @@ 3USomeStruct_type @@ A)

如果我在templatefile.h中添加一个新的extern变量定义,编译器就会停止抱怨。

file templatelibfile.h:

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

但是我希望避免它,因为我不知道这是否是正确的事情(我不想冒险改变UglyLib的语义,重新定义不同的实例somestruct变量)。 你有一些建议,以避免链接问题,而无需重新定义somestruct extern变量? 非常感谢!

1 个答案:

答案 0 :(得分:4)

这可能是因为C ++编译器的名称错误。由于anotherugly.c是C源(可能是使用C编译器编译),因此符号somestruct将被暴露而不会被破坏。当您使用C ++编译器编译其余文件时,链接器会查找不存在的错位名称。

我认为围绕ugly.h extern "C"中的声明可能会解决问题。