来自另一个DLL的未解析的外部静态数据成员

Unresolved external on static data member from another DLL

本文关键字:外部 静态 数据成员 另一个 DLL      更新时间:2023-10-16

考虑以下From.dll库定义From类的源代码:

头:

// From.h
#include <afxwin.h>
#include <afxext.h>
class AFX_EXT_CLASS From
{
    public:
        static const char staticMember[666];
};
实现:

// From.cpp
#include "From.h"
const char From::staticMember[] = "Total Crap";

这个库静态成员staticMember必须从下面的To类中使用,这也必须产生一个DLL (To.dll):

头:

// To.h
#include <afxwin.h>
#include <afxext.h>
class AFX_EXT_CLASS To
{
    public:
        static const char* retExtStatic();
};
实现:

// To.cpp
#include "To.h"
#include "From.h"
const char* To::retExtStatic()
{
    return From::staticMember;
}

但是当链接To.dll时,我一直得到这个LNK2001: unresolved external symbol "public: static char const * const From::staticMember" (?staticMember@From@@2QBDB),无论它是直接在Visual Studio上还是如果它是cmake生成的nmake:

Linking CXX shared library To.dll
   Creating library To.lib and object To.exp
To.cpp.obj : error LNK2001: unresolved external symbol "public: static char const * const From::staticMember" (?staticMember@From@@2QBDB)
To.dll : fatal error LNK1120: 1 unresolved externals

第一个DLL被编译并链接好了。以下是我的CMakeLists.txt的相关部分:

add_definitions (-D_AFXDLL -D_AFXEXT -DPSAPI_VERSION=1)
set (CMAKE_MFC_FLAG 2) # Use MFC in a shared DLL
# FROM
file (GLOB FROM ${CMAKE_CURRENT_SOURCE_DIR}/From.cpp)
add_library (From SHARED ${FROM})
target_link_libraries (From)
# TO
file (GLOB TO ${CMAKE_CURRENT_SOURCE_DIR}/To.cpp)
add_library (To SHARED ${TO})
target_link_libraries (To From)

我在导出这个静态数据成员时做错了什么?

正如@Niall和@Igor Tnadetnik在对这个问题的评论中指出的那样,当一个DLL需要另一个DLL时,如果在其中用AFX_EXT_CLASS声明类,则包含要使用的DLL的头文件是不安全的。在这种情况下,由于客户端代码也是一个DLL, AFX_EXT_CLASS将被定义为__declspec(dllexport),而不是__declspec(dllimport)