2011-12-19 105 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 XPORT宏)使用这个数学DLL我试图访问这些静态的成员之一:

#include <brMath/brVector3f.h> 

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

在其他平台上的任何运作良好,但与2010年MVSE我得到 一个连接失败:

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]B)". 
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 ========== 

我不是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中才能进入地狱?

我找不到这个引种任何区别:http://stackoverflow...c-data-in-a-dll 所以通常应该是工作...

现在我跑出来的想法可能是错误的。 我很感激任何帮助或暗示。

+2

您声明'NEGATIVE_UNIT_X'但定义了'UNIT_X'。这是一个错字吗? – Baltram 2011-12-19 13:42:59

+0

Yepp这是一个复制和粘贴失败,对不起。正确的定义是brVector3f brVector3f :: NEGATIVE_UNIT_Z(0.0f,0.0f,-1.0f); – Hellhound 2011-12-19 15:27:46

回答

1

“...在文件范围修改变量或函数时,static关键字指定变量或函数具有内部链接(其名称在声明它的文件外部不可见)。” from MSDN

+0

基本上是这样,但我发现有几个消息来源说,如果我使用导入/导出宏,这个导出应该是可能的: http://www.gamedev.net/topic/498607-problem-w-static-const -member-variable-in-dll/ 我也检查了一些开源项目,即Ogre和我见过那些项目使用这种机制。但我不确定这些项目是否支持MVSE 2010,新MVSE是否可能更具限制性? – Hellhound 2011-12-20 11:25:00

+1

这里引用的静态变量不在文件范围内:它在类范围内。它在声明文件的外部是可见的,但每个类只有一个变量,而不是每个对象一个变量。 我不知道DLL的一面...... – Zero 2012-09-13 07:52:33