как скомпилировать несколько экземпляров исходного файла, ссылаясь на него в разных файлах. - PullRequest
0 голосов
/ 16 марта 2012

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

Графически объяснено:

file_one.c (те же имена методов и параметры file_two.c)

file_two.c

file_test.c

Я хочу:

compile -> file_test.c file_one.c

compile -> file_test.c file_two.c

в make-файле без создания двух копий file_test.c


CC = gcc

CFLAGS = -c -Wall

все: test_matrice test_lista

test_matrice: grafi_test.c grafi_matrice.o

       $(CC) grafi_test.c grafi_matrice.o -o test_matrice 

test_lista: grafi_test.c grafi_liste.o

       $(CC) grafi_test.c grafi_liste.o -o test_lista 
* 1031grafi_matrice.o: grafi_matrice.c grafi_matrice.h
       $(CC) $(CFLAGS) grafi_matrice.c 

grafi_liste.o: grafi_liste.c grafi_liste.h

       $(CC) $(CFLAGS) grafi_liste.c 

clean: rm -rf * .o test_matrice 1038 test_matrice test*


Я получаю эту ошибку:

gcc grafi_test.c grafi_matrice.o -o test_matrice

grafi_test.c: 4: ошибка: expected '=', ',', ';', 'asm' или ' атрибут ' перед '*' токеном

grafi_test.c: в функции 'main':

grafi_test.c: 21: ошибка: «граф» необъявлен (первое использование в этой функции)

grafi_test.c: 21: ошибка: (каждый необъявленный идентификатор сообщается только один раз

grafi_test.c: 21: ошибка: для каждой функции, в которой она появляется.)

grafi_test.c: 21: ошибка: «G» необъявлено (первое использование в этой функции)

make: * [test_matrice] Ошибка 1


Спасибо, Джорджо

Ответы [ 2 ]

1 голос
/ 16 марта 2012

Это сделает это:

file_test_%: file_test.c file_%.c
    $(CC) $^ -o $@

И если вы хотите, вы можете добавить правило по умолчанию:

all: file_test_one file_test_two

EDIT
Проблема в ваших декларациях . Если у вас есть такая функция в grafi_matrice.c:

void graph(int n)
  {
      ...
  }

тогда код в другом файле, например grafi_test.c, не может просто вызвать его. Компилятор пытается скомпилировать grafi_test.c, достигает строки graph(3) и говорит: " graph ()? Я ничего не знаю об этом". Вы должны по крайней мере иметь объявление в grafi_test.c (над вызовом), например:

void graph(int);

Обычный способ справиться с этим - с помощью заголовочных файлов , но это может подождать.

EDIT:
Компилятор до сих пор ничего не знает о graph. Вы должны узнать о декларациях, иначе у вас не будет шансов на успех. Для начала, что grafi_matrice.c говорит о graph?

1 голос
/ 16 марта 2012

Написать make-файл для получения желаемого результата для file_one.c;продублируйте строку, которая выполняет компиляцию, и отредактируйте ее для использования file_two.c И используйте другое имя для созданного исполняемого файла.

Если вы предоставили пример того, как вы создадите свой результат для file_one.c,Я мог бы быть более конкретным.

...