2011-12-19 2 views
0

Visual Studio Express 2010を使用してDLLからスタティックメンバーをリンクする際に奇妙な問題が発生しました.Linuxプラットフォーム とMSYS/MinGW(GCC)ではこのエラーは発生しません。DLLからスタティックメンバーをリンクします

私はこのライブラリモジュールに対して明示的に輸出のマクロを使用して、数学ライブラリをしました:

#ifdef WIN32 
    #ifdef MATH_LIBRARY_EXPORT 
    #define MATH_LIBRARY_API __declspec(dllexport) 
    #else 
    #define MATH_LIBRARY_API __declspec(dllimport) 
    #endif 
#else 
    //define empty values for linux OS 
    #define MATH_LIBRARY_API 
#endif 

そして、これは私が静的メンバにエクスポート私Vectorクラスのスニップです:

ifndef BINREV_VECTOR_H__ 
#define BINREV_VECTOR_H__ 

// include common header with dll import/export macro 
#include <brMath/brCommons.h> 

namespace binrev{ 
namespace brMath{ 

class MATH_LIBRARY_API brVector3f 
{ 
    public: 
    float m_fX, m_fY, m_fZ; 

    brVector3f(void); 
    brVector3f(float x, float y, float z); 

    ... 

    public: 
    static const brVector3f ZERO; 
    static const brVector3f NEGATIVE_UNIT_Z; 
    ... 
}; 

そして、 cppモジュール:

// Ensure that the dll hader will be exported 
#define MATH_LIBRARY_EXPORT 
#include <brMath/brVector3f.h> 

namespace binrev{ 
namespace brMath{ 

const brVector3f brVector3f::ZERO(0.0f, 0.0f, 0.0f); 
const brVector3f brVector3f::NEGATIVE_UNIT_Z(0.0f, 0.0f, -1.0f); 

... 

私のグラフィックスモジュール(別の明示的なe何かがうまく動作しますが、MVSE 2010と私は にリンカの障害を持って、他のプラットフォームでは

#include <brMath/brVector3f.h> 

brMath::brVector3f brCamera::getDirection(void) 
{ 
    return m_orientation.rotate(brMath::brVector3f::NEGATIVE_UNIT_Z); 
} 

1>------ Erstellen gestartet: Projekt: ZERO_CHECK, Konfiguration: Debug Win32 ------ 
2>------ Erstellen gestartet: Projekt: brGraphics, Konfiguration: Debug Win32 ------ 
2> brCamera.cpp 
2>brCamera.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: static class binrev::brMath::brVector3f const binrev::brMath::brVector3f::NEGATIVE_UNIT_Z" ([email protected]@[email protected]@@[email protected])". 
2>C:\binrev\repository\binrevengine\modules\brGraphics\trunk\bin\brGraphics.dll : fatal error LNK1120: 1 nicht aufgelöste externe Verweise. 
========== Erstellen: 1 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ========== 

XPORTマクロ)この数式を使用して、私はそれらの静的メンバの1にアクセスしようとするDLL私はMVSEの友人ではなく、これは私のコードをMVSEで実行可能にする最初の試みです。私は別のソリューションを持っていますが、プロジェクト設定でbrMath.libを追加の依存関係として追加しました。また、追加のライブラリディレクトリのパスをbrMath.libの場所に設定しました。これは私の設定の見直しのためのリンカコマンドの出力です:

/OUT:"C:\binrev\repository\binrevengine\modules\brGraphics\trunk\bin\brGraphics.dll" /INCREMENTAL /NOLOGO 
/LIBPATH:"C:\binrev\repository\binrevengine\modules\brMath\trunk\lib\Debug" /DLL "kernel32.lib" "user32.lib" "gdi32.lib" 
"winspool.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "comdlg32.lib" "advapi32.lib" "brCore.lib" "brMath.lib" 
"c:\binrev\development\vs2010\VC\lib\libboost_signals-vc100-mt-gd-1_47.lib" "c:\binrev \development\vs2010\VC\lib\libboost_system-vc100-mt-gd-1_47.lib" 
/MANIFEST /ManifestFile:"brGraphics.dir\Debug\brGraphics.dll.intermediate.manifest" /ALLOWISOLATION 
/MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"C:\binrev\repository \binrevengine\modules\brGraphics\trunk\bin\brGraphics.pdb" 
/SUBSYSTEM:CONSOLE /STACK:"10000000" /PGD:"C:\binrev\repository\binrevengine\modules\brGraphics\trunk\bin\brGraphics.pgd" /TLBID:1 
/DYNAMICBASE /NXCOMPAT /IMPLIB:"C:/binrev/repository/binrevengine/modules/brGraphics /trunk/lib/Debug/brGraphics.lib" /MACHINE:X86 /ERRORREPORT:QUEUE 

何が正しくリンクされていることを私もそうです。 brVector3fのconst static dllメンバの呼び出しを削除すると、ビルドは成功しています。 const staticメンバーに問題があるはずです。しかし、なぜ地獄でMVSEだけ?

私はこのintroducionに任意の違いを見つけることができませんでした:http://stackoverflow...c-data-in-a-dll だから、正常に動作しなければならない...

今私が間違っている可能性がどのようなアイデアが不足して。 私は何か助けやヒントに感謝しています。

+2

あなたは 'NEGATIVE_UNIT_X'を宣言しますが、' UNIT_X'を定義します。それはタイプミスですか? – Baltram

+0

Yeppコピー&ペーストに失敗しました。申し訳ありません。正しい定義はbrVector3f brVector3f :: NEGATIVE_UNIT_Z(0.0f、0.0f、-1.0f)です。 – Hellhound

答えて

1

"...ファイルスコープで変数または関数を変更するとき、staticキーワードは変数または関数に内部リンケージがあることを指定します(その名前は宣言されているファイルの外からは見えません)。 MSDN

+0

基本的には真ですが、インポート/エクスポートマクロを使用している場合、このエクスポートが可能であると述べたいくつかのソースが見つかりました: http://www.gamedev.net/topic/498607-problem-w-static-const -member-variable-in-dll/ 私はOpen Sourceプロジェクト、つまりOgreもチェックしました。しかし、これらのプロジェクトがMVSE 2010をサポートしているかどうかはわかりませんが、新しいMVSEがより限定的になる可能性はありますか? – Hellhound

+1

ここで参照される静的変数はファイルスコープではなく、クラススコープ内にあります。それは宣言されているファイルの外側から見ることができますが、オブジェクトごとに1つではなく、クラスごとに1つの変数しかありません。 私は物事のDLL側については考えていない... – Zero

関連する問題