gpt4 book ai didi

c++ - 从 dll 链接静态成员

转载 作者:行者123 更新时间:2023-11-28 08:12:47 26 4
gpt4 key购买 nike

我在使用 Visual Studio Express 2010 从 dll 链接静态成员时遇到一个奇怪的问题。在 Linux 平台上和 MSYS/MinGW (GCC) 不会发生此故障。

我有一个数学库,该库模块明确使用导出宏:

#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);

...

在我的图形模块(也是一个具有不同显式导出宏的 dll)中使用这个 Math dll 我尝试访问其中一个静态成员:

#include <brMath/brVector3f.h>

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

在其他平台上一切正常,但在 MVSE 2010 上我得到了链接器失败:

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" (?NEGATIVE_UNIT_Z@brVector3f@brMath@binrev@@2V123@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 的 friend ,这是我第一次尝试让我们的代码可以使用 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 在 hell ?

我找不到这个介绍有什么不同:http://stackoverflow...c-data-in-a-dll所以它通常应该工作......

现在我想不出哪里出了问题。我很感激任何帮助或提示。

最佳答案

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

关于c++ - 从 dll 链接静态成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8562128/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com