La vinculación con un dll comstack, pero provoca un segfault

He estado trabajando en la comstackción con Visual Studio 2015 de una gran cantidad de archivos de código escritos originalmente para usar en Linux, utilizando g ++. Específicamente, necesito un .dll para usar con otro progtwig. Lamentablemente, me he encontrado con una serie de problemas.

Después de investigar un poco, intenté agregar __declspec (dllexport) a los archivos de encabezado. Esto ayudó con algunos de los errores de comstackción, pero no funcionó para las funciones y variables de miembro estático. Luego hice un archivo .def, que eliminó los errores restantes en la comstackción, pero al ejecutar algunas de las pruebas comstackdas al mismo tiempo (y con el mismo comstackdor), muchas de ellas fallaron debido a segfaults. Estas mismas pruebas tienen éxito si lo compilo como .lib, o si vinculo las pruebas directamente a varios archivos de objetos, pero para el progtwig final necesito un .dll (la comstackción original que usa g ++ construye un .so). No he podido encontrar a nadie más con un problema similar a este.

Aquí hay una versión simplificada de algunos de los códigos que he encontrado que son relevantes para una de las líneas que causarán un fallo de seguridad:

En la biblioteca, el encabezado:

class FirstClass { public: static const char *FIRST_CLASS_NAME; } 

y el archivo cpp:

 const char *FirstClass::FIRST_CLASS_NAME = "FIRST_CLASS"; 

Cualquier cosa en el archivo de prueba que haga referencia a esta variable causará un segfault con un .dll. Concretamente, si tengo la línea.

 std::cout << FirstClass::FIRST_CLASS_NAME << std::endl; 

luego, si está vinculado a un .dll, se segfault, pero si está vinculado a un .lib, se mostrará

 FIRST_CLASS 

Como este es un proyecto más para comstackr una gran cantidad de código creado por otros (no entiendo todo eso, ya que soy bastante nuevo en c ++), preferiría no tener que editar mucho el código fuente en sí, pero parece como debería ser más que ver con

Cualquier ayuda para entender lo que está pasando aquí sería muy apreciada.

Los datos estáticos en la dll están en un espacio de direcciones diferente, por lo que no puede hacer referencia directamente a ellos (la llamada debe asignarse a través de una tabla de importación). Cuando vinculas una biblioteca estática, todo está en el espacio de direcciones del ejecutable, por lo que puedes.

Debe utilizar dllexport y dllimport como un par. dllexport donde los defina en la biblioteca compartida (dll) y dllimport donde los use en la aplicación. Por lo general, tendrá una macro que se evalúa como __declspec (dllexport) o __declspec (dllimport) dependiendo de dónde se use. P.ej

 #ifdef _DLL // inside the DLL #define DLLExportImport __declspec(dllexport) #else // outside the DLL #define DLLExportImport __declspec(dllimport) #endif 

Y úsalo donde definas la clase:

 class DLLExportImport FirstClass { ... }; 

Definiendo el símbolo _DLL según corresponda en los proyectos respectivos. Visual Studio predefine _DLL cuando creas un nuevo proyecto dll.

No hay necesidad de archivos .def en la mayoría de los casos en estos días.