Использование статической переменной const приводит к неопределенному символу (LNK2001) в Visual Studio 2015 - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь создать действительно простую DLL-библиотеку с использованием Visual Studio 2015 и CMake.

Чтобы избежать возможных сложностей с экспортом символов DLL, в CMake включен экспорт символов для Windows:

set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS on)

Моя DLL содержит одну пару файлов (header и CPP):

file.h

#include <array>
#include <string>

class MyDLL
{
    static const std::array<std::string, 2> MY_ARRAY;
};

file.cpp

const std::array<std::string, 2> MyDLL::MY_ARRAY =
{{
    "one",
    "two"
}};

Но это всегдаприводит к LNK2001 Неразрешенный внешний символ для MyDLL :: MY_ARRAY

Я прочитал

https://social.msdn.microsoft.com/Forums/vstudio/en-US/e6badd8c-434a-4c5b-b5c2-1d58f4b5dd81/exporting-const-static-data-members-to-dll?forum=vclanguage

, но AFAIK, все эти странные макросы MS (dllexport / dllimport)уже охватывается настройками CMake.На самом деле, dllimport кажется не обязательной функцией, а помощником для компилятора.

Они выглядят довольно похоже, но пока без ответа:

Используйте обаCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS и GENERATE_EXPORT_HEADER для CMake с MSVC и GCC

http://www.cplusplus.com/forum/general/185807/

Фактически, собственная документация MS предлагает:

https://msdn.microsoft.com/en-us/library/f6xx1b1z.aspx

"Попытка ссылаться на функции или данные, которые не имеют внешней связи, может вызвать LNK2001. В C ++ встроенные функции и данные const имеют внутреннюю связь, если явно не указано как extern."

но изменение заголовка на:

class MyDLL
{
    extern static const std::array<std::string, 2> MY_ARRAY;
};

приводит к целому ряду новых проблем: -)

Я также попробовал встроенное определение MyDLL :: MY_ARRAY в заголовке:

class MyDLL
{
    static const std::array<std::string, 2> MY_ARRAY =
    {{
        "one",
        "two"
    }};
}

Но тогда это вызывает ошибку C2864: статический член данных с инициализатором в классе должен иметь энергонезависимый константный интегральный тип (в моем случае это std :: array).

Любая идея о том, что я миssing?

Заранее большое спасибо.

Примечание: Работает без изменений в Linux + gcc 4.8 и MacOSX + AppleClang 9.1.0.9020039

...