Использование переменных makefile в C - PullRequest
8 голосов
/ 14 апреля 2011

Мне нужно прочитать файл в программе на C, и я не хочу жестко задавать путь к этому файлу.Я хочу предоставить этот путь в качестве переменной Make, а затем использовать его в проге C.

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 ]

17 голосов
/ 14 апреля 2011

Вероятно, следует сделать с параметром командной строки, но, если вы должны сделать это в make-файле, вы можете использовать следующее:

$ 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]

Это немного отличается от простого жесткого кодирования значения в исходном коде - вам придется перекомпилировать, если вы когда-нибудь захотите изменить строку (вот почему я предложил параметр командной строки в первом абзаце).

3 голосов
/ 14 апреля 2011

Вы бы хотели обработать это через конкатенацию строк:

Makefile:

PATH = "/usr/bin/"

program: # whatever
    $CC /DPATH=$(PATH)

Тогда в вашем C-файле вы получите что-то вроде:

fopen(PATH "xyz.txt", "r");

Во время предварительной обработки компилятор объединит строки в одну строку.

2 голосов
/ 14 апреля 2011

Если вы gcc или любой подобный компилятор, вы можете использовать флаг -D, задокументированный внутри страницы руководства.

Чтобы сделать краткий обзор, вы можете сделать gcc -DSYMBOL=1, и это приведет к тому, что компилятор добавит это в код:

#define SYMBOL 1

Итак, в вашем make-файле вы можете установить переменную make, а затем передать ее в параметры командной строки gcc.

0 голосов
/ 30 сентября 2015

Я новичок в makefile, и, наконец, у меня появился лучший способ передавать переменные от makefile до #define, и Escape не повлияет на них.

1. передать строку

Вы можете использовать следующий код

-D STRING_SAMPLE='"string sample"'

равно

#define STRING_SAMPLE "string sample"

2. передать int или char

Вы можете использовать следующий код

-D CHAR_SAMPLE="'\n'"

равно

#define CHAR_SAMPLE '\n'

3. SampleCode

//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");
}
...