2009-06-09 18 views
8

Estoy planeando utilizar bibliotecas en mi programa C++. El desarrollo está ocurriendo en Linux, pero la aplicación está diseñada para compilar tanto en Linux como en Windows. Entiendo que el equivalente directo para bibliotecas compartidas (.so) en Windows es DLL, ¿verdad?Crear bibliotecas de programas en Windows y LINUX [C++]

En Linux usando g ++, puedo crear una biblioteca compartida usando -fPIC y -shared banderas. AFAIK, no se requiere otro cambio de código para una biblioteca compartida. Pero las cosas son diferentes en una DLL de Windows. Allí debo especificar las funciones que deben exportarse usando dllexport, ¿verdad?

Mi pregunta es ¿cómo puedo manejar esta situación? Quiero decir dllexport no es válido en Linux y el compilador dará un error. Pero es requerido en Windows. Entonces, ¿cómo escribo una función que se compilará en ambas plataformas sin ningún cambio de código?

Compiladores utiliza

  • g ++ - LINUX
  • VC++ - Windows

Cualquier ayuda sería grande!

Respuesta

9

especificamos __declspec(dllexport) para la clase:

#define EXPORT_XX __declspec(dllexport) 

class EXPORT_XX A 
{ 
}; 

entonces usted puede comprobar para la plataforma y sólo definir la macro en las ventanas. Ej .:

#ifdef WIN32 
#define EXPORT_XX __declspec(dllexport) 
#else 
#define EXPORT_XX 
#endif 

Nosotros construimos sobre todo bibliotecas estáticas lo que puede haber más cosas que ver en las librerías dinámicas pero el concepto es el mismo - el uso macro preprocesador para definir cadena que hay que insertar en el código de Windows.

+0

Gracias. ¿Cuál será el tipo de DLL creado en las ventanas? ¿Será eso un dll COM? ¿Hay posibilidades de tener problemas con DLL? –

+0

El uso de dllexport no hace que el dll se exponga al sistema COM. Las posibilidades de un infierno dependen de cómo distribuyas el dll y la aplicación. Si siempre instala los dlls que su aplicación requiere, entonces el problema relacionado con este dll no es un problema. –

+0

@sean e: Gracias. Siempre instalaré la aplicación DLL requerida en el directorio de la aplicación. A veces puede haber pequeñas actualizaciones que simplemente reemplazarán una DLL en lugar de una aplicación completa. será eso un problema? –

2

Puede usar la directiva de preprocesador #ifdef para la compilación condicional. Por ejemplo:

#ifdef WIN32 
    // Win32 specific code 
#else 
    // Elsewhere 
#endif 
5

Otra alternativa es simplemente usar un archivo .def para su proyecto de Windows. Este archivo especifica las exportaciones de DLL, por lo que no tendrá que estropear su base de código. (Pero las macros son definitivamente el camino a seguir si desea evitar el archivo adicional.)

+0

El uso de símbolos C++ en archivos .def puede ser bastante complicado. –

+0

Depende de lo que esté haciendo, si por las bibliotecas se refiere a algún tipo de arquitectura de complementos, está mejor con una interfaz C y los archivos .def funcionarían. – diapir

1

Otra opción, una que uso ahora, es usar MinGW en Windows. De esta manera puedes usar gcc en Windows, y no tienes que preocuparte por las tonterías de declspec.

+1

Gracias por la respuesta. Bueno, esta es una aplicación de código abierto y quiero admitir una amplia gama de compiladores para compilar la aplicación con éxito. Así que supongo que todas estas tonterías son obligatorias. –

Cuestiones relacionadas