Использование переменных makefile в C
Мне нужно прочитать файл в программе C, и я не хочу жестко кодировать путь к этому файлу. Я хочу предоставить этот путь в качестве переменной Make, а затем использовать его в C prog.
file name is xyz.txt and I want to do something like this in C prog:
fopen ("PATH/xyz.txt", "r");
here PATH is specified in make command that compiles this file.
Как я могу это сделать?
4 ответов
это наверное должны быть сделано с параметром командной строки, но, если вы должны сделать это в makefile, вы можете использовать следующее:
$ cat makefile
qq: myprog.c makefile
gcc -DMYSTRING='"hello"' -o myprog -Wall myprog.c
$ cat myprog.c
#include <stdio.h>
int main(void) {
printf ("[%s]\n", MYSTRING);
return 0;
}
на -D
указывает время компиляции #define
, который устанавливает MYSTRING
до "hello"
.
затем, когда вы используете MYSTRING
в коде он превратился в строку. В этом примере кода я просто передаю его printf
но вы могли бы с тем же успехом передать его fopen
согласно вашему требованию.
когда вы запускаете этот исполняемый файл, вывод:
[hello]
это немного отличается от простого жесткого кодирования значения в исходном коде - вам придется перекомпилировать, если вы когда-либо захотите изменить строку (именно поэтому я предложил параметр командной строки в первом абзаце).
вы хотите обработать это с помощью конкатенации строк:
makefile:
PATH = "/usr/bin/"
program: # whatever
$CC /DPATH=$(PATH)
тогда в вашем файле C у вас будет что-то вроде:
fopen(PATH "xyz.txt", "r");
компилятор будет объединить строки в одну строку во время предварительной обработки.
Если вы gcc или любой подобный компилятор, вы можете использовать -D
флаг, документально внутри manpage.
чтобы дать краткий обзор, вы можете сделать gcc -DSYMBOL=1
, и это приведет к тому, что компилятор добавит это в код:
#define SYMBOL 1
Итак, в вашем makefile вы можете установить переменную make, а затем передать ее в параметры командной строки gcc.
Я новичок в makefile, и я, наконец, получил лучший способ передать переменные из makefile
to #define
, и не будет влиять на побег.
1. передайте строку
вы можете использовать следующий код
-D STRING_SAMPLE='"string sample"'
равна
#define STRING_SAMPLE "string sample"
2. передайте int или char
вы можете использовать следующий код
-D CHAR_SAMPLE="'\n'"
равна
#define CHAR_SAMPLE '\n'
3. Пример код
//makefile sample
CC = gcc
CCFLAGS = -Wall -O
//run `make test` in terminal
test:main run clean
run:
@./main.e
main:
@$(CC) $(CCFLAGS) -c main.c -D STRING_SAMPLE='"string sample"' -D CHAR_SAMPLE="'\n'" -o main.o
@$(CC) main.o -o main.e
.PHONY:clean
clean:
@rm *.e
@rm *.o
и main.c
//sample code in C
#include "stdio.h"
#include "string.h"
int main(void){
puts("start test char");
printf("value(hex)==%.2x\n",CHAR_SAMPLE);
puts("end test char");
int i;
puts("start test string");
for (i=0; i< sizeof(STRING_SAMPLE); i++) {
printf("value%d(hex)==<%.2x>\n",i,STRING_SAMPLE[i]);
}
puts("end test string");
}