#linux #gcc
#linux #gcc
Вопрос:
У меня есть несколько проектов, в которых я использую много пользовательских макросов. Например,
//prog.c
#include <stdio.h>
#ifdef DBG_LEVEL_1
#define P(d) printf("%s:%dn", #d, d);
#else
#define P(...)
#endif
#ifdef INLINE
#define INL static inline
#else
#define INL
#endif
INL void func_Sqr(int a)
{
printf("sqr(a):%dn", a*a);
}
int main()
{
int a = 3;
P(a);
func_Sqr(a);
return 0;
}
Я компилирую это несколькими способами,
gcc prog.c
gcc -DINLINE prog.c
gcc -DDBG_LEVEL_1 prog.c
gcc -DDBG_LEVEL_1 -DINLINE-DINLINE prog.c
Есть ли способ установить эти макросы включенными по умолчанию через переменную среды?
Мы можем решить эту проблему, создав makefile, где установлены эти макросы. Но я хочу знать, есть ли какое-либо решение, связанное со средой Linux
Комментарии:
1. Вы можете установить переменную окружения для каждого из этих макросов и вызвать эту переменную с помощью
gcc
и вашего исходного файла. Это должно быть тривиально
Ответ №1:
Есть ли способ установить эти макросы включенными по умолчанию через переменную среды?
Как правило, нет. Переменные среды не влияют на аргументы Gcc (за исключением, может быть DEPENDENCIES_OUTPUT
..).
Я советую написать небольшую функцию-оболочку вокруг команды, например, функцию bash:
wgcc() {
gcc "${GCCARGS[@]}" "$@"
}
а затем выполнить:
GCCARGS =(-DA=1 -DB=2)
wgcc something.c
это просто сделать, легко понять и поддерживать, а также общаться с другими членами команды, легко реализовать и поделиться. Удивительно, что haisenbugs будет легко отслеживать — wgcc
отличается ли тогда уникальное имя gcc
. Тем не менее, вы могли бы перезаписать исходную команду с помощью gcc() { command gcc "${GCCARGS[@]}" "$@"; }
или путем создания /usr/local/bin/gcc
файла, что делает его немного более запутанным.
Но! Вы можете, и я бы настоятельно не советовал этого делать, потому что это будет сбивать с толку других и трудно поддерживать. Вы можете использовать переменную среды COMPILER_PATH для перезаписи инструментов компилятора и предоставления пользовательских параметров. Пошагово:
- Создайте временный каталог
- В этом каталоге все подпрограммы gcc привязаны к его обычному префиксу, за исключением инструментов, поведение которых вы хотите изменить, например
cc1
. - Затем создайте
cc1
как скрипт, который вызовет оригиналcc1
, но будет использовать некоторую переменную среды для передачи дополнительных аргументов. - Затем экспортируйте путь как COMPILER_PATH, чтобы gcc его принял.
На моем archlinux с gcc10.0.1 я сделал:
mkdir /tmp/temp
cd /tmp/temp
for i in /usr/lib/gcc/x86_64-pc-linux-gnu/10.1.0/{cc1plus,collect2,lto-wrapper,lto1}; do ln -vs "$i"; done
printf "%sn" '#!/bin/sh' '/usr/lib/gcc/x86_64-pc-linux-gnu/10.1.0/cc1 $GCCARGS "$@"' > cc1
chmod x cc1
export COMPILER_PATH=/tmp/temp
После этого вы можете:
export GCCARGS=-DA=1
gcc -xc - <<<'int main() { printf("A=%dn", A); }'
./a.out
> A=1