-I标志在make文件中不起作用

时间:2014-03-31 15:48:37

标签: compiler-construction makefile

我刚写了简单的make文件来编译任意数量的文件。当我添加-I标志来添加包含目录时,它不起作用。

    CC=g++
    CFLAGS=-I./inc
    DEPS = add.h mul.h
    OBJ = main.o add.o mul.o 

    %.o: %.c $(DEPS)
        $(CC) -c -o $@ $< $(CFLAGS)

    main: $(OBJ)
        $(CC) -o $@ $^ $(CFLAGS)

以下是我执行make时的输出。你可以看到-I./inc缺失

    ~/PGMS/testMakeFile > make
    g++    -c -o main.o main.cc
    main.cc:1:17: fatal error: add.h: No such file or directory

我已经浪费了很长时间来解决这个问题,有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:5)

您编写的用于处理.o文件的规则永远不会被调用,因为它是从%.c文件而不是%.cc文件构建的。因此,使用make.cc C ++变量调用$(CXX) $(CXXFLAGS)文件的隐式规则。

CFLAGS=-I./inc更改为CXXFLAGS += -I./inc,它应该有效。


所有这一切,-I标志是预处理器标志,这意味着您实际上应该使用CPPFLAGS变量(并且它将继续按预期工作,因为隐式使用CXXFLAGSCPPFLAGS

因此可以简化您的makefile:

OBJ := main.o add.o mul.o
DEP := add.h mul.h

CPPFLAGS := -Iinc

main: $(OBJ)
    $(CXX) $(LDFLAGS) $^ $(LDLIBS) -o $@

$(OBJ): $(DEP)

答案 1 :(得分:0)

看起来您没有.cc文件规则(请​​注意您的自定义规则是将.c文件转换为.o文件)。

请注意,在gnu make(至少)中,默认的c ++规则(即.cc文件)默认使用CXXFLAGS变量。见the GNU make