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