When I want to compile the Raci.c
file by executing gcc Raci.c
, I get the following error :
Raci.c:32:14: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘WinMain’ 32 | int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE, hPrev, LPSTR lpCmdLine, int nCmdShow) {
I've been trying to find the solution for a long time and I can't find it.
Thanks in advance and sorry if it's a 'stupid' bug I've been studying C on my own for a short time.
I attach the content of Raci.c
:
│ File: Raci.c
───────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
1 │
2 │ #include<stdio.h> // Libreria estandar para valores entrada/salida
3 │ #include<stdlib.h> // Define 4 variables, macros y otras funciones generales
4 │ #include<unistd.h> // Proporciones acceso a la API de POSIX (Operating System Interface). Estander IEEE que permite compatibilidad entre diferente S.O.
5 │
6 │ #ifdef _WIN32
7 │ #include<winsock2.h> // Nos permite establecer conexiones con el servidor
8 │ #include<windows.h> // Definimos que trabajaremos con Windows y nos aporta compatibilidad con ciertas funciones
9 │ #include<winuser.h> // Permite diferentes funciones Windows Based
10 │ #include<wininet.h> // Permite conexiones inet (detallar)
11 │ #include<windowsx.h> // Mas compatibilidad Windows
12 │ #endif
13 │
14 │ #include<string.h> // Permite manipular arrays de characteres comodamente (strings(
15 │ #include<sys/stat.h> // Libreria C POSIX que contiene construcciones que facilitan obtención de información sobre atributos de archivos
16 │ #include<sys/types.h> // Diferentes variables y estructuras...
17 │
18 │
19 │ /*
20 │ Función main/prinicpal donde estableceremos conexión con el servidor y especificaremos el resto de funciones.
21 │
22 │ APIENTRY => Alias de WINAPI (Explicamos al compilador como manejar el stack y argumentos al llamar la función)
23 │
24 │
25 │ PARAMETERS :
26 │
27 │ HINSTANCE hInstance => Identificador de instancia / modulo. El S.O. utiliza este valor para identificar el EXE cuando es cargador en memoria.
28 │ HINSTANCE hPrev => Identificador de instancia previo
29 │ LPSTR lpCmdLine => Contiene la linea de comandos en un String Unicode (Nos da la shell utilizando un charset en casi todos los idiomas (UNICODE))
30 │ int nCmdShow => Indicador de tamaño de ventana CMD (pequeña, grande, invisible ...)
31 │ */
32 │ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmdLine, int nCmdShow) {
33 │
34 │ // Inicializaciones de consola
35 │
36 │ HWND stealth; // Identificador de ventana parte de Win32 API
37 │ AllocateConsole(); // Inicializa nueva consola permitiendo entrada / salida y control de errores de esta misma.
38 │ stealth = FindWindowA("ConsoleWindowClass", NULL); // Función para encontrar la ventana con ClassName "ConsoleWindowClass" sin especificar titulo. Busca la ventana / proceso
39 │
40 │ ShowWindow(stealth,0); // Inicializamos la consola sin mostrarla
41 │
42 │ }
CodePudding user response:
APIENTRY
is not defined in any of the headers included by your program.
For a program using the Windows API, you should define _WIN32
on the compiler command line so it includes the OS specific headers that define all these symbols and types...
Try: gcc -D_WIN32 Raci.c -o Raci.o
As commented by David Grayson, your compiler might not be installed correctly to compile Windows programs.
CodePudding user response:
I answer my question in case this resolves the same error for someone.
When wanting to compile the C Raci.c
file by executing a gcc Raci.c
the error occurs:
Raci.c:32:14: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘WinMain’ 32 | int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmdLine, int nCmdShow) {
This is due to the fact that the gcc compiler has Linux-based systems as "target / destination"
and when wanting to compile headers / headers with "target / destination", Windows based skips the above error.
Excerpt from the line that indicates target from gcc:
gcc -v : Target: x86_64-linux-gnu
Solution
Using the mingw32
package we can compile and link headers to Windows on our Linux system.
- Install mingw32 =>
apt install mingw-64
- Example to compile / use x64-bit =>
x86_64-w64-mingw32-g [file.c]
- Example to compile / use 32-bit =>
i686-w64-mingw32-g [file.c]