如何输入gcc main.c而不是更长的输入

axr492tv  于 2023-06-28  发布在  其他
关注(0)|答案(1)|浏览(107)

我试图让头文件SDL2/SDL.h在C中工作,并有以下代码:

#include <stdio.h>
#include <SDL2/SDL.h>
#define WIDTH 800
#define HEIGHT 600
#define DELAY 1000

int main (int argc, char **argv)
{
   SDL_Window *window = NULL;

   if (SDL_Init(SDL_INIT_VIDEO) != 0) {
      fprintf(stderr, "SDL failed to initialise: %s\n", SDL_GetError());
      return 1;
   }

   window = SDL_CreateWindow("SDL Example", SDL_WINDOWPOS_UNDEFINED, 
            SDL_WINDOWPOS_UNDEFINED, WIDTH, 
            HEIGHT, 0);

   if (window == NULL) {
      fprintf(stderr, "SDL window failed to initialise: %s\n", SDL_GetError());
      return 1;
   }

   SDL_Delay(DELAY);

   SDL_DestroyWindow(window);

   SDL_Quit(); 

   return 0;
}

请注意,我没有写过这段代码,我也不是100%理解它。我只是想找点有用的东西来表达我的问题。无论如何,当我使用命令提示符运行程序时,我输入以下内容:

gcc -std=c11 main.c -I{Path to SDL2\include} -L{Path to SDL2\lib} -Wall -lmingw32 - lSDL2main -lSDL2 -o main

这里没有错误,输入后:

main.exe

这工作得很好,但是当我在Visual Studio Code的终端中输入与上面相同的输入时,我想知道一些问题。
首先,我需要输入:

.\main.exe

而不是:

main.exe

为什么?
其次,每次编译这段代码时,我都需要输入:

gcc -std=c11 main.c -I{Path to SDL2\include} -L{Path to SDL2\lib} -Wall -lmingw32 - lSDL2main -lSDL2 -o main

(Note括号不包含在实际代码中)
但是,我习惯只进:

gcc main.c

接着是:

.\a

但是当我输入前一个输入时,我得到了这个错误:

C:\Users\ALEXAN~1\AppData\Local\Temp\cck2ylh0.o:main.c:(.text+0x15): undefined reference 
to `SDL_Init'
C:\Users\ALEXAN~1\AppData\Local\Temp\cck2ylh0.o:main.c:(.text+0x1e): undefined reference 
to `SDL_GetError'
C:\Users\ALEXAN~1\AppData\Local\Temp\cck2ylh0.o:main.c:(.text+0x78): undefined reference 
to `SDL_CreateWindow'
C:\Users\ALEXAN~1\AppData\Local\Temp\cck2ylh0.o:main.c:(.text+0x86): undefined reference 
to `SDL_GetError'
C:\Users\ALEXAN~1\AppData\Local\Temp\cck2ylh0.o:main.c:(.text+0xb5): undefined reference 
to `SDL_Delay'
C:\Users\ALEXAN~1\AppData\Local\Temp\cck2ylh0.o:main.c:(.text+0xc0): undefined reference 
to `SDL_DestroyWindow'
C:\Users\ALEXAN~1\AppData\Local\Temp\cck2ylh0.o:main.c:(.text+0xc5): undefined reference 
to `SDL_Quit'
c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../libmingw32.a(main.o): 
(.text.startup+0xa0): undefined reference to `WinMain@16'
collect2.exe: error: ld returned 1 exit status

如果我每次编译都要输入很长的输入,那将是一场噩梦!怎样才能避免这种情况并保持我熟悉的习惯呢?我在Visual Studio Code上使用带有32位MinGW编译器的Windows(尽管我有64位处理器)。

bq3bfh9z

bq3bfh9z1#

在cmd.exe shell 中,解析可执行文件的路径时隐式包括当前工作目录。在bash或power shell等shell中,情况并非如此。可以配置VSCode以支持各种shell(https://code.visualstudio.com/docs/terminal/shell-integration)。但是,为了保存键入.\而恢复到CMD.exe可能是一种倒退。
gcc main.c,编译main.c并使用默认构建选项将目标代码与标准库和运行时链接。它只适用于没有第三方库的简单的单个源文件构建。任何重要的应用程序都需要更复杂的构建选项来编译和链接多个源文件和第三方库,支持调试,指定警告级别,控制优化等。
通常你会使用makefile或类似的构建管理器,或者IDE。对于简单的构建,您可以创建一个批处理文件,但是您的构建可能很快就超出了这个范围。一个合适的构建系统将管理数百个源文件和依赖项,以便只重建已更改或依赖于已更改内容的代码。
如果我每次编译都要输入很长的输入,那将是一场噩梦!
这是一个如何操作计算机的问题,而不是编程的问题。一个简单的解决方案是将build命令添加为VSCode任务,如https://devblogs.microsoft.com/cppblog/building-your-c-application-with-visual-studio-code/所述。这类似于批处理文件的建议,当然除了您可以定义一个调用构建管理器(如make或cmake)的任务。

相关问题