makefile:在-I之后给出的路径但找不到头文件

时间:2016-11-11 20:14:28

标签: c++ makefile googletest

我正在尝试使用Google测试框架:https://github.com/google/googletest/tree/master/googletest

我有4个文件:

factorial.cpp:

#include "factorial.h"

int factorial(int n) { [some code here] }

facotrial.h:

int factorial(int n);

test_factorial.cpp

#include "gtest/gtest.h"
#include "factorial.h"

[some tests here]

gtest_main.cpp:

#include <stdio.h>
#include "gtest/gtest.h"

GTEST_API_ int main(int argc, char **argv) {
  printf("Running main() from gtest_main.cc\n");
  testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}

我还有一个makefile,其中包含(除其他外):

INCLUDES = -I/home/my_username/Documents/gtest/googletest/googletest/include
[...]
$(MAIN): $(OBJS)
        $(CC) $(CFLAGS) $(INCLUDES) -o $(MAIN) $(OBJS) $(LFLAGS) $(LIBS)

在终端中写make后,我得到:

test_factorial.cpp:1:25: fatal error: gtest/gtest.h: No such file or directory
compilation terminated.
makefile:27: recipe for target 'test_factorial.o' failed

问题是什么?

在googletest的README文件中,他们说:

g++ -isystem ${GTEST_DIR}/include -pthread path/to/your_test.cc libgtest.a \
    -o your_test

所以这里-isystem代替-I,但我也遇到了-isystem问题。

1 个答案:

答案 0 :(得分:0)

您已将您的包含添加到链接命令,但未添加到编译命令。这条规则:

$(MAIN): $(OBJS)
        $(CC) $(CFLAGS) $(INCLUDES) -o $(MAIN) $(OBJS) $(LFLAGS) $(LIBS)

告诉如何从目标文件链接主程序。此规则不用于编译目标文件:假设您的[...]没有编译规则,那么您使用的内置编译器规则并不适用了解INCLUDES变量。

如果您在向test_factorial.cpp收到错误时向我们展示了编译命令make print,那么很明显该标志丢失了。

如果你不构成自己的变量来保存这些标志,而是使用CPPFLAGS变量作为C预处理器标志的标准变量,如-I,它就可以正常工作。

CPPFLAGS = -I/home/my_username/Documents/gtest/googletest/googletest/include

它可能会起作用。