Un enfoque común es tener una sola macro (vamos a llamarlo EXPORT
) que, o bien se expande a dllimport
o dllexport
dependiendo de si algún tipo de "generar el archivo DLL en este momento" definir es establece, de esta manera:
#ifdef MAKEDLL
# define EXPORT __declspec(dllexport)
#else
# define EXPORT __declspec(dllimport)
#endif
class EXPORT xyz {
// ...
};
La idea es que cuando la construcción de su DLL, se agrega 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 cuando se utiliza el código anterior tal como está, ya no es posible compilar el código directamente en algún módulo cliente ya que no es posible definir la macro EXPORT
en nada. Para lograr eso, necesitaría tener otra verificación que, si es verdadera, define EXPORTAR a nada.
Sobre 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 esa manera, no se exportará todos los miembros privados/protegidas:
class xyz
{
public:
EXPORT void printing();
EXPORT void printing(int a);
};
Para mi sorpresa, no lo hice encuentra una pregunta existente que esta duplica. Hubiera pensado que es una pregunta bastante común. –
Comprobar: http://stackoverflow.com/questions/6620791/exporting-classes-to-dlls – Ajay