2017-02-22 58 views
-1

Я пишу простой проект makefile.Как связать объекты из разных директорий (работает ld)

Я пытаюсь построить программу в два этапа:

  1. исходных компиляции файлов и сохранять объектные файлы в другой каталог
  2. связывает объекты в исполняемый

рассмотреть что-то простой как:

all: 
    gcc -o ~/some_dir/main.o -c main.c 
    ld -o my_program main.o 

проблема заключается в вызове directo ry не «~/some_dir», поэтому ld не находит объектный файл ... как я могу включить «some_dir» в путь поиска ld?

В более глобальной перспективе у меня есть объектные файлы в разных каталогах, и я бы хотел связать их все вместе, используя один файл команды компоновщика.

Спасибо.

+0

Ум, указав полезный путь к объекту для связи? Как * else * вы бы это сделали? Но в любом случае лучше всего использовать 'gcc' в качестве драйвера компоновщика вместо прямого вызова компоновщика:' gcc -o my_program ~/some_dir/main.o'. –

+0

Кроме того, вместо использования путей, привязанных к домашнему каталогу текущего пользователя ('~/some_dir'), было бы гораздо разумнее разместить построенные файлы в местах относительно рабочего каталога для сборки и найти исходные файлы относительно каталога содержащий Makefile. –

ответ

0

Вы делаете вещи намного сложнее, чем они должны быть, и должны позволить make сделать больше работы для вас. Ниже ваш простой пример переписан

SRCS=main.c 
BUILDDIR=~/somedir 
OBJS=$(SRCS:%.c=$(BUILDDIR)/%.o) 
CFLAGS=-g 

all: my_program 

my_program: $(OBJS) 
     $(CC) $(CFLAGS) -o [email protected] $^ 

$(BUILDDIR)/%.o: %.c 
     $(CC) $(CFLAGS) -c -o [email protected] $^ 

Он определяет число переменных в верхней части, такие как Суданская Красный Полумесяц, который будет содержать список ваших исходных файлов, каталог, в котором вы храните объектные файлы и генерируете список объектов, которые вы будете создавать. Затем он использует $(OBJS), чтобы определить, что они являются зависимыми от my_program. $ @ В правиле make является переменной, означающей «то, что мы строим», а $^- список зависимостей. Вы можете добавить другие зависимости в my_program и не нужно менять выполняемую команду.

Тогда существует правило, определяющее, как объектные файлы в $(BUILDDIR) создаются из исходных файлов в текущем каталоге.