【发布时间】: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