Использование переменных 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");
}
