es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Compilar bibliotecas de Windows API DLL en plataforma Linux usando PIP de Python.

He escrito una biblioteca de C ++ para un proyecto de Python. Normalmente compilo esa biblioteca usando PIP a través de setuptools. Esa biblioteca de C ++ tiene dos dependencias principales, la API de Windows y OpenCV.

He resuelto el problema con OpenCV primero utilizando vcpkg y pasando la ubicación de las bibliotecas al archivo .h principal a través de una declaración macro con #pragma comment(lib, ruta_a_lib), y luego copiando solo las bibliotecas que necesito dentro de mi espacio de trabajo y pasando al script de setuptools la ruta de esa carpeta. Todo salió perfectamente.

El problema viene con la API de Windows. Tengo lo siguiente:

mi_archivo_de_cabecera.h

# pragma once

# pragma comment(lib, "kernel32.lib")

# pragma comment(lib, "user32.lib")

# pragma comment(lib, "gdi32.lib")

# pragma comment(lib, "comdlg32.lib")

...

(código C ++)

En Windows 10, setuptools llama internamente al compilador MSVC y todo funciona bien.

Ahora me muevo a Manjaro. Ahora, setuptools usa el compilador GCC. Obviamente, no tengo disponible la API de Windows, así que intenté instalar MigGW-64, eliminar las declaraciones de biblioteca #pragma comment y apuntar a las bibliotecas pasando la ruta a la carpeta MinGW-64 en la variable de script de setuptools library_dirs, y pasando el nombre de las bibliotecas necesarias a la variable libraries.

No funcionó.

Luego, simplemente continué y copié todos los archivos necesarios directamente en el espacio de trabajo del proyecto y ajusté la ruta según la nueva ubicación. Ahora tengo errores en esas dependencias porque tienen dependencias faltantes declaradas en sus archivos. Parece lógico, por cierto.

Leí que algunas personas usan wine, otros hablan de boost (¿tiene una biblioteca muy similar a la API de Windows si entiendo correctamente?), otros dicen que reemplazan las funciones de la API de Windows por las equivalentes de las bibliotecas POSIX.

¿Cuál sería la mejor manera de poder compilar mi proyecto en un entorno UNIX con esas dependencias?

La forma deseada para mí sería tener esas bibliotecas copiadas en la carpeta de mi proyecto y bien enlazadas, para poder clonar el proyecto desde GitHub en cualquier PC con cualquier sistema operativo en cualquier parte del mundo.

Saludos.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como la API de Windows no está disponible en un entorno UNIX, es necesario encontrar otra manera de mantener la funcionalidad de la biblioteca en este escenario.

    Una solución potencial es utilizar una biblioteca que proporcione una capa de compatibilidad para las funciones de API de Windows en UNIX, como wine. Este enfoque permitiría que la biblioteca siga utilizando la API de Windows sin necesidad de realizar ningún cambio en el código.

    Otra solución potencial es reemplazar las funciones de API de Windows por funciones equivalentes de la biblioteca POSIX. Esto requeriría modificar el código de la biblioteca para utilizar las nuevas funciones, pero permitiría que la biblioteca funcione sin dependencias externas.

    Una tercera solución sería utilizar una biblioteca como boost, que proporciona una biblioteca similar a la API de Windows. Este enfoque requeriría modificar el código de la biblioteca para utilizar la biblioteca boost, pero permitiría que la biblioteca mantenga su funcionalidad sin depender de la API de Windows.

    En última instancia, la mejor solución depende de las necesidades específicas del proyecto y del nivel de esfuerzo necesario para implementar cada solución. La solución deseada de mantener las bibliotecas dentro de la carpeta del proyecto se puede lograr con cualquiera de estas soluciones, siempre y cuando los archivos de la biblioteca se incluyan y vinculen correctamente.

Comments are closed.