2009-08-05 17 views
25

Necesito ayuda para escribir código multiplataforma; no es una aplicación, sino una biblioteca.Bibliotecas dinámicas de plataforma cruzada C++; Linux y Windows

Estoy creando una biblioteca tanto estática como dinámica con la mayor parte del desarrollo hecho en Linux, tengo la biblioteca estática y compartida generada en Linux pero ahora quería generar una versión de Windows de una biblioteca estática y dinámica en el formulario de .lib y .dll usando el mismo código fuente.

¿Esto es posible? Estoy un poco preocupado porque noté que es necesario generar archivos de Windows .dll usando _dllspec o algo similar en su código fuente.

Si no, alguien me puede aconsejar la mejor y más rápida solución para obtener mi código compilado en Windows. No necesito hacer la compilación en Linux. Me complace hacerlo directamente en Windows. También estoy usando dos bibliotecas externas que son boost y Xerces XML que he instalado tanto en mi sistema Windows como en Linux, así que espero que no sean un problema.

Lo que realmente quiero es tener una única copia de código fuente que pueda compilarse tanto en Linux como en Windows para generar bibliotecas específicas para cada plataforma. Realmente no me importa si tengo que editar mi código a favor de Windows o Linux, siempre que pueda tener una única copia del código fuente.

+0

La compilación cruzada generalmente se refiere al software de construcción en una plataforma que se ejecutará en otra. Como dice que quiere un código fuente que pueda compilarse tanto en Linux como en Windows, entonces su pregunta es más acerca de cómo escribir una base de código fuente portátil y multiplataforma que sobre la compilación cruzada. –

+0

GIYF En realidad, en este caso, libtool es tu amigo ... –

+0

Mientras esperas respuestas, revisa CMake: http://www.cmake.org/ – Pete

Respuesta

18

En general, hay dos cuestiones que necesita para estar preocupados con:

  1. El requisito de que, en Windows, el archivo DLL exporta explícitamente símbolos que deben ser visibles para el mundo exterior (a través de __declspec(dllexport) y
  2. Ser capaz de mantener el sistema de construcción (lo ideal sería no tener que mantener un archivo MAKE separada y Microsoft Visual C++ Proyecto/Solución)

para el primero, que se necesitan para aprender sobre __declspec(dllexport). en Solo proyectos de Windows, generalmente esto se implementa de la manera que describo en mi respuesta al this question. Puede ampliar esto un paso más para asegurarse de que su símbolo de exportación (como MY_PROJECT_API) esté definido pero se expanda a nada cuando se compile para Linux. De esta forma, puede agregar los símbolos de exportación a su código según sea necesario para Windows sin afectar la compilación de Linux.

Por el segundo, puede investigar algún tipo de sistema de compilación multiplataforma.

Si se siente cómodo con el conjunto de herramientas GNU, es posible que desee investigar libtool (quizás en conjunción con automake y autoconf). Las herramientas se admiten de forma nativa en Linux y se admiten en Windows a través de Cygwin o MinGW/MSYS. MinGW también le ofrece la opción de realizar compilaciones cruzadas, es decir, crear sus binarios nativos de Windows mientras ejecuta Linux. Dos recursos que he encontrado útiles en la navegación del Autotools (incluyendo libtool) son los "Autobook" (concretamente de la sección DLLs and Libtool) y Alexandre Duret-Lutz's PowerPoint slides.

Como otros han mencionado, CMake es también una opción, pero no puedo hablar por mí mismo.

+0

gracias, hice algunas búsquedas en Google y supongo que busqué las cosas incorrectas, libtool suena interesante y quizás cmake como alguien mencionado anteriormente. Soy algo nuevo en Linux, por lo que estas herramientas no sonarán rápidamente: p –

9

Puede hacerlo fácilmente con # ifdef's. En Windows _WIN32 debe ser definido por el compilador (incluso para 64 bits), así como el código de

#ifdef _WIN32 
# define EXPORTIT __declspec(dllexport) 
#else 
# define EXPORTIT 
#endif 

EXPORTIT int somefunction(); 

debería funcionar bien para usted.

+0

hmm, sí, pensé en eso, veré cómo sería, podría usar esto como último recurso si no tengo suerte con el herramientas anteriores –

+0

@iQ: Todavía tendrá que hacer esto, incluso con las herramientas anteriores. No manejan la exportación por usted, simplemente ocultan algunas de las diferencias entre el proceso de compilación en las diferentes plataformas. –

+0

Sí, supongo que tiene razón, voy a tener que usar macros. Actualmente estoy tratando de ver bloques de código que creo que puede definir automáticamente un archivo .def para usted, aunque no sé qué tan bueno o malo es eso. Voy a tener que experimentar un poco. –

7

tal vez es mejor si se agrega extern "C" !!!,

/* * presentar CMakeLists.txt/

SET (LIB_TYPE SHARED) 

ADD_LIBRARY(MyLibrary ${LIB_TYPE} MyLibrary.h) 

/* archivo * MyLibrary.h/

#if defined(_WIN32) || defined(__WIN32__) 

    #if defined(MyLibrary_EXPORTS) // add by CMake 

    #define MYLIB_EXPORT extern "C" __declspec(dllexport) 
    #else 

    #define MYLIB_EXPORT extern "C" __declspec(dllimport) 

    #endif /* MyLibrary_EXPORTS */ 

#elif defined(linux) || defined(__linux) 

#define MYLIB_EXPORT 

#endif 


MYLIB_EXPORT inline int Function(int a) 

{ 
    return a ; 
} 
+1

Por el amor de dios, ¡utilice un formato más agradable! – tstenner

+0

@tstenner ¿Quiere decir que no solo LE ENCANTAN cuando las personas crean su propio estilo de formateo mientras escriben su código? :) –

+0

@tstenner estuvo de acuerdo ... este "formato" es demasiado ... ¿cómo puedo decir ... –

Cuestiones relacionadas