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 だから、正常に動作しなければならない...
今私が間違っている可能性がどのようなアイデアが不足して。 私は何か助けやヒントに感謝しています。
あなたは 'NEGATIVE_UNIT_X'を宣言しますが、' UNIT_X'を定義します。それはタイプミスですか? – Baltram
Yeppコピー&ペーストに失敗しました。申し訳ありません。正しい定義はbrVector3f brVector3f :: NEGATIVE_UNIT_Z(0.0f、0.0f、-1.0f)です。 – Hellhound