0

私はこれを静的変数で何時間も解決しようとしてきunresolved external symbolましたが、私は頭が痛いです。私は Visual Studio 2010 を使用しています。状況の簡単な概要を次に示します。

問題のプロジェクト:

-ProjA (outputs a .dll and .lib)
-ProjB (outputs a .exe)

ProjA には、次の 2 つのファイルがあります。

//foo.h
#pragma once

class SUP
{
public: 
    static int staticint;
};

//foo.cpp
#include "foo.h"
int SUP::staticint = 10;

ProjA.lib への ProjB リンク

//main.cpp
#include "{Full_Path}foo.h"
int main(){
   std::cout << SUP::staticint << std:: endl;
}

現在、main.cpp は問題なくコンパイルされていますが、プロジェクトをビルドしようとすると、次のエラーが発生します。

main.obj : error LNK2001: unresolved external symbol "public: static int SUP::staticint" (?staticint@SUP@@2HA)

ProjB のオプションを正しく設定したことはほぼ 100% 確信しています。「追加の依存関係」の下にはすべて「ProjA.lib」があり、「追加のライブラリ ディレクトリ」の下には ProjA.lib ファイルが生成されるディレクトリへのパスがあります。

ProjA で .map ファイルを出力したこともあり、マップには次のようなものがあります。 0003:00004458 ?staticint@SUP@@2HA 10049458 foo.obj

だから私はそれstaticintが正しく定義されていることを意味すると推測しています。

何がうまくいかない可能性がありますか?明らかに、私は何か間違ったことをしていますが、何が間違っているのかわかりません。ProjB が正しい .lib ファイルにリンクしていることを確認しました。インクルードディレクトリが適切であることを確認しました。static 変数の定義が適切であることを確認しました。必要に応じて他の情報を提供します。

4

1 に答える 1

1

MSVS では、エクスポートするシンボルを明示的に宣言する必要があります__declspec(dllexport)

は別のライブラリにあるためSUP、エクスポートされたシンボルのみが他のモジュールで使用できます。他のモジュールはそれらを としてマークする必要があります__declspec(dllimport)

この二重の動作は通常、マクロによって実現されます。

#ifdef EXPORT_MODULE
#define DLLIMPEXP __declspec(dllexport)
#else
#define DLLIMPEXP __declspec(dllimport)
#endif

として宣言されたクラス

class DLLIMPEXP SUP
{
public: 
    static int staticint;
};

whereEXPORT_MODULEは、シンボルをエクスポートするプロジェクトで定義されています。

于 2012-08-27T21:01:38.203 に答える