C++ 与dll链接会编译,但会导致错误

C++ 与dll链接会编译,但会导致错误,c++,dll,visual-studio-2015,C++,Dll,Visual Studio 2015,我一直在使用Visual Studio 2015编译大量最初为linux编写的代码文件,使用g++。 具体来说,我需要一个.dll与另一个程序一起使用。不幸的是,我遇到了一些问题 在做了一些研究之后,我尝试将_declspec(dllexport)添加到头文件中。这有助于解决一些编译错误,但对静态成员函数和变量不起作用。然后我创建了一个.def文件,该文件消除了编译过程中的剩余错误,但是在运行同时编译的一些测试(并且使用同一个编译器)时,其中许多测试由于SEGFULTS而失败。 如果我将其构建为

我一直在使用Visual Studio 2015编译大量最初为linux编写的代码文件,使用g++。 具体来说,我需要一个.dll与另一个程序一起使用。不幸的是,我遇到了一些问题

在做了一些研究之后,我尝试将_declspec(dllexport)添加到头文件中。这有助于解决一些编译错误,但对静态成员函数和变量不起作用。然后我创建了一个.def文件,该文件消除了编译过程中的剩余错误,但是在运行同时编译的一些测试(并且使用同一个编译器)时,其中许多测试由于SEGFULTS而失败。 如果我将其构建为.lib,或者如果我将测试直接链接到各种对象文件,这些相同的测试就会成功,但是对于最终的程序,我需要一个.dll(最初使用g++构建的是一个.so)。 我一直找不到其他有类似问题的人

以下是一些代码的简化版本,我发现这些代码与将导致SEGFULT的一条线路相关:

在库中,标题为:

class FirstClass
{
public:
  static const char *FIRST_CLASS_NAME;
}
和cpp文件:

const char *FirstClass::FIRST_CLASS_NAME = "FIRST_CLASS";
测试文件中引用此变量的任何内容都将导致.dll出现segfault。具体来说,如果我有这条线

std::cout << FirstClass::FIRST_CLASS_NAME << std::endl;
由于这是一个需要编译大量由他人创建的代码的项目(并非我所理解的所有代码,对c++来说是相当陌生的),因此我不希望对源代码本身进行太多编辑,但它似乎应该更多地与


如果您能帮助您理解这里发生了什么,我们将不胜感激。

dll中的静态数据位于不同的地址空间中,因此您无法直接引用它(必须通过导入表映射调用)。链接静态库时,所有内容都在可执行文件的地址空间中,因此您可以

必须成对使用dllexport和dllimport。在共享库(dll)中定义它们的dllexport和在应用程序中使用它们的dllimport。通常情况下,宏的计算结果为uu declspec(dllexport)或u declspec(dllimport),具体取决于它的使用位置。例如

#ifdef _DLL     // inside the DLL
  #define DLLExportImport __declspec(dllexport)
#else          // outside the DLL
   #define DLLExportImport __declspec(dllimport)
#endif
并在定义类时使用它:

class DLLExportImport FirstClass
{ ... };
在各个项目中定义适当的符号
\u DLL
。当您创建新的DLL项目时,Visual Studio预定义了DLL


现在大多数情况下都不需要.def文件。

答案应该会给你一些启示。我不是def文件专家,但我在我的时间里,通过上面链接中提到的u declspec dllimport/dllexport语义,已经取得了巨大的成功。我很好奇,你对declspec(dllexport)有什么问题?我建议,不要dllexport静态成员。dllexport是一个函数。用函数封装静态成员。我误解了如何使用这些宏。当我正确使用_declspec时,测试是成功的。谢谢大家。
class DLLExportImport FirstClass
{ ... };