2015-09-01 3 views
2

Makefile в подкаталоге моего проекта не видит путь включения ТОЛЬКО, когда он используется из основного Makefile моего проекта. У меня нет большого опыта работы с Makefile, и многое из того, что я читал, довольно запутанно. Вот схема моего каталога (с тем, что я до сих пор, так как я только начал проект):Makefile не может найти include path

main/ 
    Inventory/ 
     Item.h 
     Item.cpp 
     Makefile 
    tools/ 
     include/ 
      json/ 
       json.h 
     jsoncpp.cpp 
     Makefile 
    main.cpp 
    Makefile 

Вот Makefile в главном каталоге:

INCLUDE = -IInventory/ 
CC = g++ 
DEP = tools/jsoncpp.o Inventory/Item.o 

Main: main.o $(DEP) 
    cd tools/ && make 
    cd Inventory/ && make 
    $(CC) -o Main main.o $(DEP) $(INCLUDE) 

main.o main.cpp 
    $(CC) -c main.cpp $(INCLUDE) 

Вот является Makefile в справочник инструментов:

INCLUDE = -Iinclude/ 
CC = g++ 

jsoncpp.o: jsoncpp.cpp 
    $(CC) -c jsoncpp.cpp $(INCLUDE) 

Когда я вызываю make из инструментов /, он работает нормально. Но когда я звоню сделать из главного каталога, я получаю эту ошибку:

g++ -c -o tools/jsoncpp.o tools/json.cpp 
tools/jsoncpp.cpp:76:23: fatal error: json/json.h: No such file or directory 
#include "json/json.h" 
        ^
compilation terminated. 

Теперь я отчасти считаю, что он не может найти каталог включать по какой-либо причине, но первая строка в этой ошибке довольно странно для меня из-за этого странного разрыва между g ++ и -c. Поскольку мой проект скоро станет довольно большим, как я могу это исправить?

ответ

2

Если это в -I директивы, она должна быть #include <json/json.h> иначе #include "include/json/json.h"

EDIT: Включите каталог берется из текущего каталога, поэтому в основной/вы должны использовать -Itools/include

Решение: использовались неявные правила поэтому для компиляции должна быть установлена ​​правильная переменная CXXFLAGS+=$(INCLUDE). См.: make manual

И главная проблема - Main: main.o $(DEP) - файлы в DEP должны существовать уже в противном случае, они будут использовать неявные правила. Позже после этого cd tools/& & сделать делается.

+0

Вот что у меня есть. jsoncpp.cpp уже имеет '#include '. Вот почему мой 'INCLUDE' имеет только' -Iinclude/'. – Cotant

+0

Итак, вы находитесь в основном/компилировании инструментов/json.cpp и имеете только -Iinclude вместо -Itools/include? – KIIV

+0

Нет, что находится в Makefile в инструментах /. Я попытался поместить его в Makefile в основную /, но это не сработало. – Cotant

0

#include <json/json.h> < - препроцессор будет искать все пути включает в себя

см gcc Include Syntax:

#include <file> This variant is used for system header files. It searches for a file named file in a standard list of system directories. You can prepend directories to this list with the -I option (see Invocation).

#include "file" This variant is used for header files of your own program. It searches for a file named file first in the directory containing the current file, then in the quote directories and then the same directories used for . You can prepend directories to the list of quote directories with the -iquote option.

+0

Это не какой-то файл, который я написал, я загрузил его из github. [https://github.com/open-source-parsers/jsoncpp] – Cotant

+0

Если вы вызываете make из основного каталога, вам нужно добавить '-Itools/include', поэтому препроцессор может найти' tools/include/json/json .h' file – frachop

+0

Как указано в комментариях в ответ KIIV, я попытался это сделать, и это не сработало. – Cotant