Makefile с подкаталогами не находит заголовки - PullRequest
0 голосов
/ 18 марта 2020

У меня есть следующая структура каталогов (в Ubuntu):

MyProject/
    Here is my Makefile
MyProject/src/headers
    Here are more subfolders and .hpp files
MyProject/src/sources
    Here are two .cpp files (main.cpp and another.cpp)

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

cppsrc = $(wildcard src/sources/*.cpp)
obj = $(cppsrc:.cpp=.o) 
flags = -I/usr/include/boost_1_72_0/ -pthread 

cross: $(obj)   
      i686-atom-linux-gnu-g++ -o $@ $^ $(flags)

Обнаруживает файл. cpp в подкаталоге (ууу!). Но он не обнаруживает заголовочные файлы, включенные в файл. cpp. Поэтому я включил заголовок в другой. cpp, например:

#include "src/headers/another.hpp"

Команда make cross выдает мне сообщение об ошибке:

g++    -c -o src/sources/another.o src/sources/another.cpp
src/sources/another.cpp:6:10: fatal error: src/headers/another.hpp: No such file or directory
 #include "src/headers/another.hpp"
          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
<builtin>: recipe for target 'src/sources/another.o' failed
make: *** [src/sources/another.o] Error 1

Сообщение об ошибке заставляет меня поверить, что makeapp ищет файл заголовка в такой позиции:

MyProject/src/sources/src/headers/

Верно ли мое предположение? Что я могу сделать, чтобы решить эту проблему? Надеюсь, что кто-нибудь сможет мне помочь. Заранее спасибо.

1 Ответ

2 голосов
/ 18 марта 2020

Вы забыли сообщить своему компилятору, что нужно искать в локальном каталоге (-I.), но есть более серьезная проблема: вы компилируете свои файлы с помощью компилятора HOST и связываете их вместе с компилятором CROSS. Это приведет к ошибкам.

Чтобы исправить это, вам нужно установить переменные, используемые в правиле COMPILE.cc по умолчанию, определенном следующим образом:

COMPILE.cpp = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
%.o: %.cpp
#  commands to execute (built-in):
        $(COMPILE.cpp) $(OUTPUT_OPTION) $<

Итак, в вашем случае:

CXX = i686-atom-linux-gnu-g++
CXXFLAGS += -I. -I/usr/include/boost_1_72_0/
LDFLAGS += -lpthread

cppsrc = $(wildcard src/sources/*.cpp)
obj = $(cppsrc:.cpp=.o) 

cross: $(obj)
      $(CXX) -o $@ $^ $(LDFLAGS)
...