4

c++アプリケーション内で醜いCライブラリを使用する必要があります。以下の説明では、それをUglyLibと呼びます。UglyLibを静的にリンクされたライブラリとして正常にコンパイルしました。ファイルugly.hで、UglyLibはextern変数を使用します。

ファイルugly.h:

extern SomeStruct_type somestruct;

変数は別のファイルで定義されています(そして使用されています)。私はそれをanotherugly.cと呼びます。

別のファイル.c:

SomeStruct_type somestruct;

私のc++アプリケーションはジェネリックテンプレートライブラリ(TemplateLib)に基づいており、アプリケーション自体はメインウィンドウのGUIコードと、メインウィンドウのコードに静的にリンクされたアプリケーションライブラリで構成されています。これを静的にリンクされたライブラリApplicationLibと呼びます。

TemplateLibにはtemplatelibfile.hが含まれています。これは、UglyLibによって公開されるextern変数であるsomestructを使用して関数fooをエクスポートします。

ファイルtemplatelibfile.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でメインウィンドウアプリケーションをコンパイルしようとすると、Microsoftリンカからこのエラーが発生します

エラーLNK2001:未解決の外部シンボル "struct SomeStruct_type somestruct"(?somestruct @@ 3USomeStruct_type @@ A)

templatefile.haにextern変数の新しい定義を追加すると、コンパイラは文句を言うのをやめます。

ファイルtemplatelibfile.h:

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

しかし、それが正しいことかどうかわからないので、避けたいと思います(UglyLibのセマンティクスを変更してsomestruct変数の別のインスタンスを再定義するリスクを冒したくありません)somestruct extern変数を再定義せずにリンクの問題を回避するために、いくつかの提案がありますか?どうもありがとう!

4

1 に答える 1

4

これはおそらく、C++コンパイラが行う名前マングリングが原因です。anotherugly.cはCソース(おそらくCコンパイラでコンパイルされている)であるため、シンボルはsomestructマングルされることなく公開されます。残りのファイルをC++コンパイラでコンパイルすると、リンカは存在しないマングル名を探します。

で宣言を囲むことで問題が解決するかもしれないugly.hと思います。extern "C"

于 2012-04-05T08:29:50.000 に答える