Можно ли передавать аргументы GCC непосредственно из исходного кода C? - PullRequest
0 голосов
/ 18 ноября 2018

Я хочу иметь возможность передавать аргументы GCC из моего C исходного кода, что-то вроде этого ...

// pass the "-ggdb" argument to GCC (I know this won't work!)
#define GCC_DEBUG_ARG -ggdb
int main(void) {
    return 0;
}

С этим кодом я хотел бы просто запустить gcc myfile.c, который действительно запустил бы gcc myfile.c -ggdb (так как аргумент "-ggdb" был выбран из исходного кода C).

Меня не интересует использование make с переменной окружения CFLAGS, Я просто хочу знать, возможно ли встраивать опции GCC в исходный код C

1 Ответ

0 голосов
/ 18 ноября 2018

То, что вы хотите сделать, вообще невозможно.

Однако недавний GCC (например, GCC 8 в конце 2018 года) принимает много опций и некоторые из них могут быть переданы атрибутами функции или с помощью прагм для конкретных функций (Однако они не принимают -g, но принимают -O2).

Кроме того, вы можете использовать -g в каждой компиляции (с GCC он может быть смешан с флагами оптимизации, такими как -O2; поэтому производительность во время выполнения не пострадает. Конечно, -g увеличит время компиляции и размер произведенного объектного файла). Обратите внимание, что (в Linux) отладочная информация DWARF видна в сгенерированном файле ассемблера (например, попробуйте скомпилировать ваш foo.c с помощью gcc -Wall -g -O -S -fverbose-asm foo.c, посмотрите на сгенерированный foo.s и повторите, удалив -g)

Я бы хотел просто запустить gcc myfile.c

Это очень плохая привычка 1034 *. Вы должны запустить gcc -Wall -Wextra -g myfile.c -o myprog, чтобы получить все предупреждения (вы действительно хотите их получить) и отладочную информацию в вашем исполняемом файле myprog. Прочитайте Как отлаживать небольшие программы , прежде чем продолжить кодирование вашей программы.

Меня не интересует использование make с переменной окружения CFLAGS

Но вы действительно должны . Использование make или другого средства автоматизации сборки (например, ninja , omake , грабли , и т. Д. И т. Д.) * - это , на практике обычный и обычный способ использования GCC .

В качестве альтернативы, в Linux напишите крошечный сценарий оболочки , выполняющий компиляцию (это особенно целесообразно, если ваша программа представляет собой один исходный файл; для чего-то большего, вы действительно должны использовать некоторый инструмент автоматизации сборки). Наконец, если вы используете emacs в качестве редактора исходного кода , вы можете добавить несколько строк комментариев (как в конце моего manydl.c пример) указание переменных файла Emacs для настройки компиляции (сделано из emacs)

Если эти соглашения вас удивят, прочитайте о философии Unix , а затем изучите - для вдохновения - исходный код некоторых существующих свободных программ (например, github, gitlab или в вашем любимом дистрибутиве Linux).

Наконец, GCC сам по себе является проектом свободного программного обеспечения (но огромным из более чем пяти миллионов строк в основном исходного кода на C ++). Таким образом, вы можете улучшить его так, как пожелаете (если вы следуете его лицензии GPLv3 + ), предварительно изучив его исходный код. Это займет у вас несколько месяцев (или лет) работы (потому что GCC очень сложен для понимания).

См. Также этот ответ на связанный вопрос.

Вы также можете (но я рекомендую этого не делать, потому что это очень запутанно) поиграть с вашей переменной PATH и иметь там какую-то директорию -e.g. $HOME/bin/, перед /usr/bin/, который содержит /usr/bin/gcc, с вашим сценарием оболочки с именем gcc; но не делайте этого, вы будете сбиты с толку. Вместо этого напишите некоторый «универсальный» mygcc сценарий оболочки , который будет запускать /usr/bin/gcc и добавить к нему соответствующие флаги (я полагаю, это не стоит усилий).

...