来自另一个DLL的未解析的外部静态数据成员
Unresolved external on static data member from another DLL
考虑以下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)
。
相关文章:
- 类内部和外部静态 constexpr 元组之间的差异
- Visual Studio 中静态库项目之间的未解析外部
- 仅在少数方法(静态或共享库)中解析的外部符号
- 用作默认参数的静态成员会导致无法解析的外部
- 使用静态 constexpr 成员的未解析外部符号
- 内联asm编译器屏障(内存阻塞器)是算作外部函数,还是算作静态函数调用
- CMake 外部和内部静态库的循环依赖关系
- Windows C++静态库在初始化期间无法访问外部方法
- 作为成员的静态类模板实例会导致未解析的外部符号错误
- CURL 静态链接未解析的外部符号
- Android:在Android Studio中链接外部静态C/C++库
- 为什么局部类定义可以从同一函数访问外部静态变量
- Qt5 未解析的外部静态元对象函数
- 外部静态库
- 从外部静态库访问函数
- 链接Qt创建者中的外部静态库
- 来自另一个DLL的未解析的外部静态数据成员
- 链接现成的外部静态库
- 外部"C"静态空隙*功能
- 函数内部和外部静态变量的区别