Pregunta ¿Cómo exportar una clase de C ++ desde un dll? [duplicar]


Esta pregunta ya tiene una respuesta aquí:

Tengo una clase que tiene dos funciones sobrecargadas. ¿Cómo lo exporto desde un dll y también cómo usarlo en otras clases de C ++? Mi clase se ve así:

#define DECLDIREXP __declspec(dllexport) 

#define DECLDIRIMP __declspec(dllimport)


class DECLDIREXP xyz 

{

public: 
          void printing();
          void printing(int a);
};  

using namespace std; 

void xyz::printing()
{
        cout<<"hello i donot take any argument";
}


void xyz::printing(int a)
{
        cout<<"hello i take "<< a <<"as argument";
}

12
2017-07-27 07:03


origen


Respuestas:


Un enfoque común es tener una sola macro (llamémoslo EXPORT) que se expande a dllimport o dllexport dependiendo de si se establece algún tipo de definición de "creación de DLL en este momento", así:

#ifdef MAKEDLL
#  define EXPORT __declspec(dllexport)
#else
#  define EXPORT __declspec(dllimport)
#endif

class EXPORT xyz {
  // ...
};

La idea es que cuando construyas tu DLL, agregues MAKEDLL a las definiciones del preprocesador. De esa forma, todo el código será exportado. Los clientes que enlazan con su DLL (y por lo tanto incluyen este archivo de encabezado) no necesitan hacer nada. Al no definir MAKEDLL, importarán automáticamente todo el código.

La ventaja de este enfoque es que la carga de obtener las macros correctas se traslada de muchos (los clientes) a solo el autor de la DLL.

La desventaja de esto es que al usar el código anterior tal como es, ya no es posible compilar el código directamente en algún módulo de cliente ya que no es posible definir el código. EXPORT macro a nada. Para lograr eso, necesitaría tener otra verificación que, si es verdadera, define EXPORTAR a nada.

En un tema ligeramente diferente: en muchos casos, no es posible (¡ni se desea!) Exportar una clase completa como esa. En su lugar, es posible que desee exportar los símbolos que necesita. Por ejemplo, en su caso, es posible que desee exportar los dos métodos públicos. De esta forma, no se exportarán todos los miembros privados / protegidos:

class xyz
{
public: 
    EXPORT void printing();
    EXPORT void printing(int a);
};

19
2017-07-27 07:10



Como recuerdo, normalmente, no exportas una clase sino una función de fábrica que crea una nueva instancia de clase y devuelve un puntero. La declaración de clase reside en el archivo de encabezado para el tiempo de compilación.

Puedo estar equivocado sobre el ejemplo (eso fue hace mucho tiempo), pero aquí cómo debería verse aproximadamente así:

Archivo de encabezado (.h):

class MyClass { ... };

extern "C" DLL_API MyClass* createMyClass();

Archivo fuente (.cpp):

DLL_API MyClass* createMyClass() {
    return new MyClass();
}

Defina MY_DLL_EXPORT durante la compilación, vea el ejemplo de respuesta de foraidt.


9
2017-07-27 07:13



Otra opción:

Utilizar el defecto macro definida local al proyecto

Puede ver las macros definidas predeterminadas para el proyecto en la ubicación siguiente:

Propiedades -> C / C ++ -> Preprocesador -> Definición del preprocesador.

Ejemplo:

Supongamos que su nombre de proyecto es: MyDLL

Macro predeterminada Local a ese proyecto: MYDLL_EXPORTS

 #ifdef  MYDLL_EXPORTS 
    /*Enabled as "export" while compiling the dll project*/
    #define DLLEXPORT __declspec(dllexport)  
 #else
    /*Enabled as "import" in the Client side for using already created dll file*/
    #define DLLEXPORT __declspec(dllimport)  
 #endif


  class DLLEXPORT  Class_Name { 
             //.... 
  }

3
2018-06-13 15:43



Al compilar su biblioteca debe definir una macro (definición de preprocesador de línea de comando), vamos a llamarlo MY_DLL_EXPORT.

Luego, en el código de tu biblioteca, haz algo como esto:

#ifdef MY_DLL_EXPORT
#  define DLL_API __declspec(dllexport)
#else
#  define DLL_API __declspec(dllimport)
#endif


class DLL_API some_class { /*...*/ }

1
2017-07-27 07:11