1

考虑以下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;
}

但是我LNK2001: unresolved external symbol "public: static char const * const From::staticMember" (?staticMember@From@@2QBDB)在链接时不断得到这个To.dll,无论它是直接在 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)

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

4

1 回答 1

0

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

于 2014-08-20T01:45:44.613 回答