Si desea compilar una biblioteca de enlaces dinámicos que pueda usarse en ambos sistemas, generalmente optará por completar el desarrollo inicial en el entorno de depuración proporcionado por VC++ en Windows. Después de todo, VC++ proporciona edición gráfica. y depuración La interfaz es mucho más conveniente que vi y gcc. Después de completar la prueba, trasplante el programa de biblioteca dinámica. Por lo general, las reglas de compilación predeterminadas de gcc son más estrictas que las reglas de compilación predeterminadas de VC++. Incluso un programa sin errores de advertencia en VC++ tendrá muchos errores de advertencia durante la depuración de gcc. Puede usar la opción -w en gcc para desactivar los errores de advertencia.
Las siguientes son las reglas y experiencias que se deben seguir para el programa de trasplante.
(1) Intente no cambiar el orden de los archivos de encabezado de la biblioteca dinámica original. Por lo general, en el lenguaje C/C++, el orden de los archivos de encabezado tiene una relación considerable. Además, aunque el lenguaje C/C++ distingue entre mayúsculas y minúsculas, cuando se incluye un archivo de encabezado, Linux debe tener las mismas mayúsculas y minúsculas que el archivo de encabezado, porque el sistema de archivos ext2 distingue entre mayúsculas y minúsculas para los nombres de los archivos; de lo contrario, no se puede compilar correctamente. En Windows, el archivo de encabezado debe estar en el mismo caso. El archivo se compila correctamente.
(2)Archivos de encabezado únicos para diferentes sistemas. En los sistemas Windows, generalmente se incluye el archivo de encabezado windows.h. Si se llama a la función de comunicación subyacente, se incluye el archivo de encabezado winsock..h. Por lo tanto, al realizar la migración a un sistema Linux, es necesario comentar estos archivos de encabezado exclusivos del sistema Windows y algunas instrucciones de definición constante del sistema Windows, y agregar archivos de encabezado que admitan la comunicación subyacente en Linux, etc.
(3)Tipo de datos. VC++ tiene muchos tipos de datos únicos, como __int16, __int32, TRUE, SOCKET, etc., y el compilador gcc no los admite. El enfoque habitual es copiar las declaraciones que definen estos datos en windows.h y basetypes.h en un archivo de encabezado y luego incluir este archivo de encabezado en Linux. Por ejemplo, cambie el tipo de socket de SOCKET a int.
(4)Palabras clave. VC ++ tiene muchas palabras clave que no se usan en C estándar, como BOOL, BYTE, DWORD, __asm, etc. Por lo general, para facilitar el trasplante, intente no usarlas. Si es inevitable, puede usar #ifdef y #. endif para LINUX y WINDOWS Escribe dos versiones.
(5) Modificación del prototipo de función. Por lo general, si usa una biblioteca dinámica escrita en lenguaje C/C++ estándar, básicamente no necesita reescribir la función. Sin embargo, para las funciones de llamada al sistema, debido a las diferencias entre los dos sistemas, debe cambiar el método de llamada. funciones, como la comunicación de red compilada en Linux, en la biblioteca dinámica, se utiliza la función close () en lugar de la función closesocket () en el sistema operativo Windows para cerrar el socket. Además, no hay ningún identificador de archivos en Linux. Para abrir un archivo, puede utilizar las funciones open y fopen. Para conocer el uso específico de estas dos funciones, consulte [2].
(6) Preparación de Makefile. En Windows, el compilador VC++ suele ser responsable de la depuración, pero gcc necesita escribir el archivo MAKE usted mismo, o puede consultar el archivo MAKE generado por VC++. Para el trasplante de biblioteca dinámica, se debe agregar la opción compartida al compilar la biblioteca dinámica. Para programas que usan funciones matemáticas, como series de potencias, debe agregar -lm al llamar a la biblioteca dinámica.
(7) Algunos otros puntos que necesitan atención
① Análisis de la estructura del diseño del programa Para trasplantar programas de biblioteca dinámica escritos por otros, el análisis de la estructura del programa generalmente es un paso esencial. programa de biblioteca, operaciones como interfaces no están incluidas, por lo que es relativamente fácil.
②En Linux, los permisos sobre archivos o directorios se dividen en propietarios, grupos y otros. Por lo tanto, al acceder a un archivo, debe prestar atención a si está leyendo o escribiendo el archivo. Si está escribiendo el archivo, debe prestar atención a modificar los permisos del archivo o directorio; de lo contrario, el archivo no se podrá escribir.
③El uso de punteros, define un puntero y le asigna solo cuatro bytes de memoria. Si desea asignar un valor a la variable apuntada por el puntero, debe usar la función malloc para asignar memoria. definirlo o no como Los punteros se pueden definir como variables. Esto es más estricto en Linux que en la compilación de Windows. De manera similar, las estructuras no se pueden pasar por valor en una función. Si desea pasar una estructura por valor en una función, la estructura en la función debe definirse como un puntero de estructura.
④El identificador de ruta es "/" en Linux y "\" en Windows. Tenga en cuenta que las rutas de búsqueda de las bibliotecas dinámicas de Linux y las bibliotecas dinámicas de Windows son diferentes.
⑤Habilidades de programación y depuración. Existen diferentes técnicas de depuración para diferentes entornos de depuración, que no se describirán aquí.