Неразрешенный внешний элемент статических данных из другой библиотеки DLL

0

Рассмотрим следующий источник библиотеки 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)

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

  • 1
    Правильно ли определен ваш AFX_EXT_CLASS при создании второй библиотеки для импорта класса вашей первой библиотеки DLL? Т.е. он меняется на правильный declspec (dllimport)? По вашему образцу я действительно могу сказать.
  • 1
    Не используйте AFX_EXT_CLASS , определите свой собственный макрос. Обычно AFX_EXT_CLASS расширяется до __declspec(dllexport) при сборке DLL и __declspec(dllimport) при __declspec(dllimport) EXE- __declspec(dllimport) . Но здесь потребитель сам является DLL, поэтому AFX_EXT_CLASS не делает правильных AFX_EXT_CLASS .
Показать ещё 1 комментарий
Теги:
dll
dllimport
afx

1 ответ

0
Лучший ответ

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню