【发布时间】:2014-11-27 09:51:37
【问题描述】:
刚开始为一个非常简单的内部使用自动化测试框架编写代码。 (我知道那里有数百个 - 也有非常好的,但目前这并不有趣,所以请不要指出其中任何一个;))然后我遇到了以下问题,我可以'不解释,所以请你帮忙。
我有以下代码作为 DLL 的一部分:
(代码还只是一个雏形,我花了不到 2 分钟的时间来写,所以它的逻辑、结构 - 没有任何东西 - 以任何方式改进。)
h 文件:
#pragma once
#ifdef __DLL__ // Defined in DLL-project
#define DLLEXPORT __declspec( dllexport )
#else
#define DLLEXPORT
#endif
class DLLEXPORT AutoTest
{
public:
enum eTestID {TESTID_SomeFunction};
AutoTest(eTestID id, LPVOID lpData)
{
if(sm_bTestsActive)
ExecTest(id, lpData);
}
void ActivateTests();
private:
static void ExecTest(eTestID id, LPVOID lpData)
{
}
static BOOL sm_bTestsActive;
};
cpp 文件:
#include "StdAfx.h"
#include "AutoTest.hpp"
BOOL AutoTest::sm_bTestsActive = FALSE;
void AutoTest::ActivateTests()
{
sm_bTestsActive=TRUE;
}
编译得很好,并且生成了 DLL。
但这是我的问题 - 使用以下方法实例化类时:
AutoTest(AutoTest::TESTID_SomeFunction, &SomeData);
在主应用程序中,链接器失败
error LNK2001: unresolved external symbol "private: static int AutoTest::sm_bTestsActive" (?sm_bTestsActive@AutoTest@@0HA)
这很有趣 - 如果我将构造函数移动到 cpp 文件(未内联)它就可以正常工作!?!?
代码如下:
h 文件:
#pragma once
#ifdef __DLL__ // Defined in DLL-project
#define DLLEXPORT __declspec( dllexport )
#else
#define DLLEXPORT
#endif
class DLLEXPORT AutoTest
{
public:
enum eTestID {FK3059};
AutoTest(eTestID id, LPVOID lpData);
void ActivateTests();
private:
static void ExecTest(eTestID id, LPVOID lpData)
{
}
static BOOL sm_bTestsActive;
};
cpp 文件:
#include "StdAfx.h"
#include "AutoTest.hpp"
BOOL AutoTest::sm_bTestsActive = FALSE;
AutoTest::AutoTest(eTestID id, LPVOID lpData)
{
if(sm_bTestsActive)
ExecTest(id, lpData);
}
void AutoTest::ActivateTests()
{
sm_bTestsActive=TRUE;
}
(粘贴后我对代码进行了一些小修改,因此可能存在也可能不存在简单的语法错误。)
另外,如果我从内联版本构造函数中删除对静态成员的引用,它工作正常。
关于为什么内联版本不起作用的任何想法?
【问题讨论】:
-
我猜你是从另一个库调用构造函数并且没有与 DLL 链接。
-
@DDrmmr 文件/类是我们的“主干”DLL 的一部分,从“客户端”大量使用。而且它也不适用于非内联版本。
-
DLLEXPORT是如何定义的? -
该 DLL 的用户不应该有一个标记为 DLL 导入的类声明吗?您不会从应用程序中导出类。无论如何,这绝对是高度特定于编译器/操作系统的。
-
@hvd 这通常是通过巧妙地定义
DLLEXPORT宏和链接器标志来完成的,但不清楚这里是如何完成的。
标签: c++ windows dll static linker