Bibliotecas dinámicas multiplataforma C++; Linux y Windows
cross-platform shared-libraries (3)
En general, hay dos cuestiones que debe tener en cuenta:
- El requisito de que, en Windows, su DLL exporte explícitamente símbolos que deberían ser visibles para el mundo exterior (a través de
__declspec(dllexport)
, y - Ser capaz de mantener el sistema de compilación (idealmente, no tener que mantener un makefile separado y el Proyecto / Solución de Microsoft Visual C ++)
Para el primero, necesitará aprender sobre __declspec(dllexport)
. En los proyectos solo para Windows, normalmente esto se implementa de la manera que describo en mi respuesta a esta pregunta . Puede extender esto un paso más allá asegurándose de que su símbolo de exportación (como MY_PROJECT_API) esté definido pero se expanda a la nada cuando se construye para Linux. De esta manera, puede agregar los símbolos de exportación a su código según sea necesario para Windows sin afectar la construcción de Linux.
Para el segundo, puedes investigar algún tipo de sistema de construcción multiplataforma.
Si se siente cómodo con el conjunto de herramientas GNU, es posible que desee investigar libtool (quizás en conjunto con automake y autoconf). Las herramientas son compatibles de forma nativa en Linux y compatibles con Windows a través de Cygwin o MinGW/MSYS . MinGW también le ofrece la opción de compilación cruzada, es decir, la creación de sus binarios nativos de Windows mientras ejecuta Linux. Dos recursos que me han resultado útiles para navegar por las Autotools (incluida libtool) son el "Autobook" (específicamente la sección sobre DLL y Libtool ) y las diapositivas de PowerPoint de Alexandre Duret-Lutz .
Como han mencionado otros, cmake.org también es una opción, pero no puedo hablar por mí mismo.
Necesito ayuda para escribir código multiplataforma; No es una aplicación, sino una biblioteca.
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 para Windows de una biblioteca estática y dinámica en forma de .lib
y .dll
utilizando el mismo código fuente.
es posible? Estoy un poco preocupado porque noté que la generación de archivos .dll
Windows requiere el uso de _dllspec
o algo similar en su código fuente.
De lo contrario, ¿alguien puede aconsejarme la mejor y más rápida solución para compilar mi código en Windows? No necesito hacer la compilación en Linux. Estoy feliz de hacerlo directamente en Windows. También estoy usando dos bibliotecas externas que son boost y Xerces XML que he instalado en mi sistema Windows y 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 copia de código fuente única.
Puedes hacerlo fácilmente con # ifdef''s. En Windows _WIN32 debe ser definido por el compilador (incluso para 64 bits), por lo que el código como
#ifdef _WIN32
# define EXPORTIT __declspec( dllexport )
#else
# define EXPORTIT
#endif
EXPORTIT int somefunction();
debería funcionar bien para usted.
Tal vez sea mejor si agrega extern "C" !!!,
/ * archivo 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;
}