Нужна помощь в понимании того, как компиляция GCC работает на Linux и MacOS - PullRequest
0 голосов
/ 09 июля 2019

Я недавно получил macbook, поэтому я начал изучать, как разрабатывать проект на macOS, для этого я попытался скомпилировать готовый проект, созданный на linux, файл .o был создан легко, но у меня возникли проблемы с исполняемым файлом.

Вот строка:

gcc -Wall -g -O2 `sdl2-config --cflags` head.h -o game.out mainSDL.o container.o update.o user.o -O2 `sdl2-config --libs` -lSDL2_image 

clang: error: cannot specify -o when generating multiple output files
make: *** [game.out] Error 1

(у меня на компьютере установлен sdl2)

Эта строка отлично работала под archlinux.

ЭтаПроект легко компилируется с помощью некоторой базовой команды, такой как:

gcc container.c mainSDL.c user.c update.c -lSDL2

Но я хотел бы понять, что происходит,

Почему эта ошибка с этой строкой?

Спасибо за вашуhelp

Редактировать: В конце концов проблема возникла из-за этого плохого make-файла, в котором была какая-то бесполезная строка и заголовок.

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

Вы отправили

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`

длясвязать результат в окончательный исполняемый файл.

Но я ничего не знаю о ваших исходных файлах, поэтому я не знаю, даст ли это правильные результаты.

0 голосов
/ 09 июля 2019
`sdl2-config --cflags` head.h

Эти биты являются подозрительными. Передавать файл заголовка компилятору почти наверняка неправильно.

В остальной части строки есть опции связывания, но --cflags выплевывает опции компиляции. Судя по всему, компиляция уже завершена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...