Я пытаюсь создать действительно простую 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