Visual studio 2015 在Visual Studio 2015上使用静态常量变量生成未定义的符号(LNK2001)

Visual studio 2015 在Visual Studio 2015上使用静态常量变量生成未定义的符号(LNK2001),visual-studio-2015,unresolved-external,lnk2001,Visual Studio 2015,Unresolved External,Lnk2001,我正在尝试使用Visual Studio 2015和CMake创建一个非常简单的DLL 为避免可能出现的DLL符号导出复杂性,CMake为Windows启用了符号导出功能: set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS on) My DLL包含一对文件(头文件和cpp): 文件.h #include <array> #include <string> class MyDLL { static const std::array<

我正在尝试使用Visual Studio 2015和CMake创建一个非常简单的DLL

为避免可能出现的DLL符号导出复杂性,CMake为Windows启用了符号导出功能:

set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS on)
My DLL包含一对文件(头文件和cpp):

文件.h

#include <array>
#include <string>

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

不过,所有这些奇怪的MS宏(dllexport/dllimport)都已经包含在CMake设置中了。实际上,dllimport似乎不是必需的特性,而是编译器的助手

这些看起来很相似,但到目前为止没有答案:

事实上,自己的MS文档表明:

<> >强>“尝试引用没有外部链接的函数或数据会导致LNK2001。在C++中,内联函数和const数据具有内在的联系,除非明确指定为Extn。”>/P> 但将标题修改为:

class MyDLL
{
    extern static const std::array<std::string, 2> MY_ARRAY;
};
类MyDLL
{
外部静态常量std::array MY_array;
};
导致了一系列全新的问题:-)

我还尝试了头中MyDLL::MY_数组的内联定义:

class MyDLL
{
    static const std::array<std::string, 2> MY_ARRAY =
    {{
        "one",
        "two"
    }};
}
类MyDLL
{
静态常量std::数组我的数组=
{{
“一个”,
“两个”
}};
}
但随后它触发了一个C2864错误:具有类内初始值设定项的静态数据成员必须具有非易失性const integral类型(在我的示例中是std::array)

你知道我错过了什么吗

先谢谢你


旁注:这在Linux+GCC4.8和MacOSX+AppleClang 9.1.0.9020039中都可以正常工作,无需修改。请参见gcc,默认情况下导出所有内容,这就是它在Linux上工作的原因。@stanthomas,但这就是WINDOWS中CMAKE_WINDOWS_导出_ALL_符号的等效功能,不是吗?此外,我几乎可以肯定我在某个地方(找不到)读到了dllimport不是强制性的,而是有帮助的。如果你在
CMAKE\u WINDOWS\u EXPORT\u ALL\u SYMBOLS
上读到这篇文章,你似乎不得不加上u declspec(dllimport):“对于全局数据符号,u declspec(dllimport)在针对DLL中的代码进行编译时必须仍然使用。“。建议您尝试根据博客添加uu declspec(dllimport)。在我看来,你还是用MS方法吧,这样你就知道我在哪里了。接得好,@stanthomas!!!,非常感谢,我试试看。尽管我仍然觉得奇怪,为什么Windows要求数据符号使用显式dllimport(),而函数不使用。Kitware博客文章解释说,CMake能够为函数生成导出/导入,但不能生成全局数据。因此,CMake不能完全复制GCC的默认行为,而不是Windows或Visual Studio。我认为在共享库中导出所有内容是不明智的,我也采用MS方法,在Linux上只显式导出所需的外部。
class MyDLL
{
    static const std::array<std::string, 2> MY_ARRAY =
    {{
        "one",
        "two"
    }};
}