【问题标题】:Unresolved external on static data member from another DLL来自另一个 DLL 的静态数据成员的外部未解析
【发布时间】:2014-08-19 18:07:38
【问题描述】:

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

标题:

// 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)

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

【问题讨论】:

  • 在构建第二个 dll 以导入第一个 dll 的类时,您的 AFX_EXT_CLASS 是否正确定义? IE。它是否更改为正确的 declspec(dllimport)?从你的样本我真的可以看出。
  • 不要使用AFX_EXT_CLASS,自己定义一个宏。通常,AFX_EXT_CLASS 在构建 DLL 时扩展为 __declspec(dllexport),在构建使用它的 EXE 时扩展为 __declspec(dllimport)。但在这里,消费者本身就是一个 DLL,所以AFX_EXT_CLASS 做的不对。
  • 确实是这个问题。对于我编造的这个小例子,如果我在将From.h 包含为__declspec(dllimport) 之前重新定义AFX_EXT_CLASS,则链接工作正常。但是现在让我感到困扰的是,我几乎可以肯定我在项目中遇到了一些案例,即使使用AFX_EXT_CLASS 声明的两个类 =( 是否有任何 AFX Windows 宏约定/帮助器来标记这些 DLL 类被其他 DLL 使用?

标签: c++ windows dll dllimport afx


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-08-24
    • 2017-10-06
    • 2020-04-02
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    相关资源
    最近更新 更多