1

私を助けてください、どうにも解決できない奇妙な問題があります。

前提: Windows 7 x64 で Visual C++ 2005 を使用しています。Linux で g++ を使用すると問題なく動作するため、コードに致命的な欠陥はないと確信しています。

私が開発した静的ライブラリを使用するアプリケーションを開発しています。

アプリケーションのリンク フェーズで、2 つの謎の LNK2019 エラーが発生します。

これは、ライブラリのクラスの 1 つのヘッダーです。

namespace sulfur
{
class Quark
{
public:
... various methods
void addAccel(const Vec2 &a);
... various methods
private:
... various data
};
}

明らかに、cpp ファイルでは、まったく同じ署名を持つ addAccel の実装を提供しています。

アプリケーションをライブラリにリンクしようとすると、addAccel を除く他のすべてのメンバー関数が見つかります。

リンカーは、シンボル "?addAccel@Quark@@QAEXABV?$TemplateVec2@M@Atlax@@@Z" を検索します。

.lib ファイルには (dumpbin を使用して見つけた) "?addAccel@Quark@sulfur@@QAEXABV?$TemplateVec2@M@Atlax@@@Z" があります。ここでの唯一の違いは、リンカが名前空間部分のないマングルされた名前を検索することであり、その理由はわかりません。

メソッドの名前、位置、呼び出し規約、署名を変更しようとしましたが、役に立たず、常に同じエラーが発生しました。

2 番目のエラーは非常によく似ています。ライブラリに別のヘッダーがあります。

namespace sulfur
{
class Cluster
{
...
Quark *addQuark(sulfur::Feature feat, float x, float y, float m=0.1f, float aF=0.01f);
...
};
}

正しい実装ファイルが提供されます。以前と同様に、他のすべてのメソッドは適切にリンクされていますが、addQuark はリンクされていません。

リンカーは、「?addQuark@Cluster@sulfur@@QAEPAVQuark@@W4Feature@2@MMMM@Z」を検索します。

しかし、ライブラリには「?addQuark@Cluster@sulfur@@QAEPAVQuark@2@W4Feature@2@MMMM@Z」があります。

今回の違いは、コンパイラが検索するバージョンの「@」の間に最初の「2」がないことです。

Visual Studio でこのアプリケーションをビルドするのはこれが初めてではなく、今回の最後の変更を除いて、常に正常にリンクされています。

手がかりがありません、事前に感謝します

4

2 に答える 2

1

関数はどこでどのようにvoid addAccel(const Vec2 &a);実装されていますか?Quark::関数の実装でプレフィックスが欠落していないことを確認しますか?

于 2010-07-29T08:39:04.047 に答える
0

さて、私はちょうど問題を解決しました。クラス Quark とクラス Cluster の 2 つの誤った前方宣言 (名前空間の外側) があります。何らかの理由で、g++ はそれで問題ありませんでしたが、VC++ はそれについて不平を言うのが正しかったのです。とにかくありがとうございました。

于 2010-07-29T15:07:35.767 に答える