Неразрешенный внешний элемент статических данных из другой библиотеки 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;
}

Но я продолжаю получать это 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)

Что я делаю не так, чтобы экспортировать этот статический элемент данных?

0

Решение

Как отметили @Niall и @Igor Tnadetnik в комментариях по этому вопросу, когда DLL нужна другая DLL, небезопасно включать заголовочный файл DLL, который будет использоваться, если в нем класс объявлен с помощью AFX_EXT_CLASS, В этом случае, поскольку клиентский код также является DLL, AFX_EXT_CLASS будет определяться как __declspec(dllexport) а не как __declspec(dllimport) как это должно.

0

Другие решения


По вопросам рекламы [email protected]