GCC Связывание ошибок времени - нет правила для определения цели - PullRequest
2 голосов
/ 16 апреля 2010

Я новичок в мире написания Makefile. У меня есть проект на C, который я хочу построить с использованием GCC, и я мог бы написать довольно хороший Makefile, который вызывает 3 других Makefile , рекурсивно представляет в другой структуре каталогов проекта , который затем отправит соответствующие исходные файлы компилятору GCC. Результатом этого шага является то, что я могу видеть все (5) объектные файлы (5) исходных файлов .

Имена объектных файлов (в порядке их генерации) -

Makefile1

imageprocessing.o (1)

morpho.o (2)

PivBlb.o (3)

Makefile2

main.o (4)

Makefile3

bmp.o (5)

Под уверенностью видеть все ожидаемые объектные файлы. Теперь я добавлю дополнительные правила в Makefile3 , чтобы связать все объектные файлы, здесь компоновщик начнет выдавать раздел ошибок, как показано ниже .

Не только это, последний объектный файл (bmp.o (5)), который генерировался ранее, это НЕ генерируется больше, мои новые обновления последнего make-файла имеют вызвал это, я думаю.

Что здесь происходит? Любые подсказки , пожалуйста?

Я также вставляю только содержимое последнего Makefile - Makefile3 , где присутствуют правила линковки, под разделом Errors .

Спасибо

-V

-------------------------------------
**Errors**

make[1]: Entering directory `/cygdrive/c/Vikram/Projects/LOD_IMX_Project_v1/LOD1/Algorithm'
make[1]: `all' is up to date.
make[1]: Leaving directory `/cygdrive/c/Vikram/Projects/LOD_IMX_Project_v1/LOD1/Algorithm'
make[1]: Entering directory `/cygdrive/c/Vikram/Projects/LOD_IMX_Project_v1/LOD1/exe'
make[1]: `all' is up to date.
make[1]: Leaving directory `/cygdrive/c/Vikram/Projects/LOD_IMX_Project_v1/LOD1/exe'
make[1]: Entering directory `/cygdrive/c/Vikram/Projects/LOD_IMX_Project_v1/LOD1/IO'
make[1]: Leaving directory `/cygdrive/c/Vikram/Projects/LOD_IMX_Project_v1/LOD1/IO'
make[1]: *** No rule to make target `../LOD1/Algorithm/imageprocessing.o', needed by `final'.  Stop.
make:  *[all] Error 2

----------------------------------------

Makefile3

CC      = $(TOOLS)/gcc
HFLAG   = ../IO/inc
CCFLAGS = -mcpu=$(HW)

OBJ1 = ../LOD1/Algorithm/imageprocessing.o ../LOD1/Algorithm/morpho.o ../LOD1/Algorithm/PivBlb.o
OBJ2 = ../LOD1/exe/main.o
OBJ3 = ../LOD1/IO/bmp.o

all: final
final: ../LOD1/Algorithm/imageprocessing.o ../LOD1/Algorithm/morpho.o ../LOD1/Algorithm/PivBlb.o ../LOD1/exe/main.o ../LOD1/IO/bmp.o
       $(CC) -o $@ $(OBJ1) $(OBJ2) $(OBJ3)

bmp.o: src/bmp.c inc/bmp.h
       $(CC) $(CCFLAGS) -I$(HFLAG) -c src/bmp.c

clean:
       rm -rf *o main.o

Ответы [ 3 ]

2 голосов
/ 16 апреля 2010

Первое, что нужно проверить, это то, что файл ../LOD1/Algorithm/imageprocessing.o действительно существует и путь указан правильно, так как make жалуется, что его невозможно найти.

Вы сами запускаете make в других каталогах? Если нет, то вы должны добавить такие правила, как

../LOD1/Algorithm/imageprocessing.o:
    $(make) -C ../LOD1/Algorithm imageprocessing.o

в ваш главный make-файл.

Также в качестве проверки вы можете определить последний результат правило для перечисления вещей, которые Make не может найти, например

%::
      -echo "Make can't find $$(pwd)$@!!!"

(это может быть специфично для GNU make)

1 голос
/ 16 апреля 2010

Звучит так, будто предложение Скотта Уэльса решило вашу проблему, но я добавлю пару других вещей.

  1. Правило связывания не должно быть в Makefile3, так как Makefile3 не имеет полномочий для создания объектов в Algorithm / и exe /, оно должно быть в главном Makefile.
  2. С помощью Скотта Уэльса вы исправили свои специфические проблемы с путями (я предполагаю, что "../LOD1/Algorithm" должен был быть "../Algorithm"), но в целом вы не должны жесткие пути к таким целям.
  3. Вы можете устранить некоторую избыточность, используя автоматические переменные , такие как $ ^.
#MAIN_DIR is /cygdrive/c/Vikram/Projects/LOD_IMX_Project_v1/LOD1
# or ../LOD1, your choice

vpath %.o $(MAIN_DIR)/Algorithm:$(MAIN_DIR)/exe:$(MAIN_DIR)/IO

.PHONY: all
all: final
final: imageprocessing.o morpho.o PivBlb.o main.o bmp.o
   $(CC) -o $@ $^
0 голосов
/ 16 апреля 2010

Исходя из вашего сообщения об ошибке, похоже, что Makefile3 выполняется в

/cygdrive/c/Vikram/Projects/LOD_IMX_Project_v1/LOD1/IO

и не может найти

/cygdrive/c/Vikram/Projects/LOD_IMX_Project_v1/LOD1/IO/../LOD1/Algorithm/imageprocessing.o

Если это так, то, возможно,

OBJ1 = ../LOD1/Algorithm/imageprocessing.o ../LOD1/Algor..

следует изменить на

OBJ1 = ../Algorithm/imageprocessing.o ../Algor

Также у вас должен быть основной Makefile, который «включает» другие make-файлы, а не запускает их в последовательности.

...