Сделать файл, имеющий два основных файла - PullRequest
3 голосов
/ 26 января 2012

Я новичок в Makefile и хочу задать вопрос о Makefile.Предположим, у меня есть две отдельные программы, имеющие собственные файлы .c .h и main.c.Ни одна из программ не связана.Можно ли сделать два исполняемых файла такой программы?Если так, как это возможно?Я пробовал это, но это не удалось, и я получил следующую ошибку:

/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: ld returned 1 exit status

Ответы [ 3 ]

7 голосов
/ 26 января 2012

В вашем make-файле вы можете иметь более одной цели.Например:

all: A B

A: mainA.c
    $(CC) -o $@ $^

B: mainB.c
    $(CC) -o $@ $^

Тогда make A построит только A, make B построит только B, а make all (или просто make) построит оба.

2 голосов
/ 26 января 2012

Если у двух программ есть файл main.c, вам нужно поместить их в две отдельные директории. Затем напишите make-файл в каждом каталоге и make-файл в верхнем каталоге, который повторяется в этих двух субмаке-файлах.

/
  Makefile
  prog0/
    Makefile
    main.c
    ...
  prog1/
    Makefile
    main.c
    ...

prog0 / Makefile будет выглядеть так:

all: prog0
prog0: prog0.o
    $(LINK.c) $(OUTPUT_OPTION) $^

Повторите для прог1. Затем в родительском каталоге напишите рекурсивный make-файл:

all:
    $(MAKE) --directory prog0 all
    $(MAKE) --directory prog1 all
0 голосов
/ 26 января 2012

Вам нужно дважды вызвать ваш компоновщик, чтобы создать две разные программы.

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

Одним из быстрых способов исправить это является разделение сети на соответствующие файлы 'mainXXX.c', а затем убедитесь, что для каждого выходного исполняемого файла есть ссылка только на один файл 'mainXXX.o'. Существуют и другие решения. Создайте тот, который соответствует вашим потребностям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...