Вы отправили
gcc -Wall -g -O2 `sdl2-config --cflags` head.h -o game.out mainSDL.o container.o update.o user.o user.o -O2 `sdl2-config --libs` -lSDL2_image
Я попытаюсь объяснить командную строку, параметр параметром:
-Wall
означает для компилятораактивировать все виды предупреждений.Предупреждения обычно не означают остановки компиляции, ошибки делают, поэтому активация их всех даст более точный подход к ошибкам кода, которые вы можете делать в коде. -g
означает включение отладочной информации (ссылки на исходные строки) в исполняемом файле, чтобы можно было выполнять отладку исходного кода. -O2
означает выполнение оптимизации второго уровня.Это обычно делает ваш код более сложным для отладки, так как ссылки на исходные строки плохо соответствуют двоичному коду.При отладке обычно -O0
(что означает отсутствие оптимизации). sdl2-config --cflags
- это команда, выполняемая оболочкой, которая выводит параметры компиляции библиотеки sdl2
.Обычно он выдает параметры -I
, необходимые для поиска файлов #include
.Он заключен в обратные кавычки (извините, но не знаю, как показать их экранирование в режиме кода), чтобы оболочка сменила параметр на вывод команды sdl2-config
. head.h
isвключаемый файл .... обычно вы получаете этот файл #include
d из других файлов, поэтому скомпилировать его напрямую - ошибка.Вы должны убрать его, так как он не предназначен для отдельной компиляции. -o game.out
означает вызов выходного исполняемого файла game.out
.Это имя выходного файла.Когда вы компилируете (не связываете) отдельные источники (используя опцию -c
) и указываете несколько файлов для компиляции, ошибочно (тот, который вы упоминаете) указывать одно выходное имя файла, поскольку каждый выходной двоичный файлвызывается после источника путем изменения суффикса .c
на .o
. mainSDL.o
, container.o
, update.o
, user.o
- это уже скомпилированные объектные модули (этоиспользуется только когда вы связываете конечный исполняемый файл) -O2
повторяется. sdl2-config --libs
это выполняется оболочкой, и ее вывод заменяется как параметры ссылки, необходимые для возможностисвязать с библиотекой sdl2
.Он генерирует -L
путей, необходимых для поиска расположения библиотеки. -lSDL2_image
это означает использование библиотеки SDL2_image
во время соединения.
Ну, это довольноплохой.sdl2-donfig --cflags
используется только для компиляции и, вероятно, генерирует (вы можете попробовать выполнить следующую команду:
sdl2-config --cflags
в командной строке отдельно), вы увидите, какие опции он даеткомпилятор.Скорее всего, он генерирует опцию -c
только для компиляции, поэтому это делает ненужными все опции .o
и -o
, и компиляция должна быть выполнена в два этапа (один для компиляции, один для ссылки)
sdl2-config --libs
добавит все библиотеки -l
к фазе соединения, поэтому нет необходимости добавлять параметр -lSDL2_image
.
Я предлагаю скомпилировать вашу программу для использования (послепытаясь угадать только то, что вы опубликовали) следующие команды:
gcc -Wall -g -O0 `sdl2-config --cflags` mainSDL.c container.c update.c user.c
(или индивидуально для каждого исходного файла) для компиляции только исходных файлов, а затем
gcc -g -O0 -o game.out mainSDL.o container.o update.o user.o `sdl2-config --libs`
длясвязать результат в окончательный исполняемый файл.
Но я ничего не знаю о ваших исходных файлах, поэтому я не знаю, даст ли это правильные результаты.