当我尝试按照 SDL2 教程用 C 创建图形窗口时,出现了这个问题。 我按照教程中创建了标头、源 .c 和 main,但是当我使用 make 运行它时,仅创建了源文件的 .o,当我转到 main 时,它说这些函数不是已宣布。
错误是 siguiente:
PS C:\Juego> make
g++ -c -I src/include -L src/lib -o main draw.c -o draw.o
g++ -c -I src/include -L src/lib -o main init.c -o init.o
g++ -c -I src/include -L src/lib -o main input.c -o input.o
g++ -c -I src/include -L src/lib -o main main.c -o main.o
main.c: En la función 'int SDL_main(int, char**)':
main.c:12:9: error: 'initSDL' no fue declarado en este ámbito
12 | initSDL();
| ^~~~~~~
main.c:18:17: error: 'prepareScene' no fue declarado en este ámbito
18 | prepareScene();
| ^~~~~~~~~~~~
main.c:20:17: error: 'doInput' no fue declarado en este ámbito
20 | doInput();
| ^~~~~~~
main.c:22:17: error: 'presentScene' no fue declarado en este ámbito
22 | presentScene();
| ^~~~~~~~~~~~
make: *** [makefile:18: main.o] Error 1
makefile 是:
# Compiler and flags
CC = g++
CFLAGS = -I src/include -L src/lib -o main
# Source files and object files
SRC = draw.c init.c input.c main.c
OBJ = $(SRC:.c=.o)
# Libraries to link
LIBS = -lmingw32 -lSDL2main -lSDL2
# Build the executable
main: $(OBJ)
$(CC) $(CFLAGS) $(OBJ) $(LIBS)
# Compile source files to object files
%.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
# Clean up
clean:
rm -f $(OBJ) main
和main.c
#include "structs.h"
#include"SDL2\SDL.h"
#define main SDL_main
int main(int argc, char *argv[])
{
memset(&app, 0, sizeof(App));
initSDL();
atexit(cleanup);
while (1)
{
prepareScene();
doInput();
presentScene();
SDL_Delay(16);
}
return 0;
}
我尝试单独编译但没有成功,只是改变了我编写makefile的方式。但没工作
main
调用的函数的声明必须存在于包含main
定义的源文件中,直接或通过#include
指令间接进行。
如果头文件(通常是名为
name.h
的文件)中有这些函数的声明,则在 #include name.h
中插入 main.c
形式的指令以包含这些指令。如果头文件中没有这些函数的声明,则要么在 main.c
中写入声明,要么将它们放入头文件中并包含它们。