我现在知道如何使用@MadScientist回答来添加
VPATH = include
到makefile。
但我认为-I选项足够了。
我的意思是,如果我的makefile有行
g++ $(CFLAGS) -I./include -c reciprocal.cpp
我认为找到我需要的文件reciprocal.h就足够了。
我不清楚我为什么要在makefile中使用gcc&的-I选项?还有一条线VPATH,告诉你在哪里寻找? - 我应该够了吗?
尝试使用makefile编译简单文件(根据高级linux编程)。
我的问题是-I选项(包含路径)。
我的文件结构很简单:
工作目录是考试。 (如果所有文件(reciprocal.cpp& reciprocal.h)都在考试目录下,所有编译好了!)
在考试中我有: 1个名为include的目录,里面有reciprocal.h。 3个文件名为main.c reciprocal.cpp& Makefile文件 像:
/exam/
include/
reciprocal.h
main.c
reciprocal.cpp
Makefile
现在, reciprocal.h代码:
#ifdef __cplusplus
extern "C" {
#endif
extern double reciprocal (int i);
#ifdef __cplusplus
}
#endif
main.c代码
#include <stdio.h>
#include "reciprocal.h"
int main (int argc, char **argv)
{
int i;
i = atoi (argv[1]);
printf ("The reciprocal of %d is %g\n", i, reciprocal (i));
return 0;
}
reciprocal.cpp代码
#include <cassert>
#include "reciprocal.h"
double reciprocal (int i) {
// I should be non-zero.
#ifdef NDEBUG
assert (i != 0);
use macro NDEBUG
#endif // NDEBUG
return 1.0/i;
}
Makefile:
reciprocal: main.o reciprocal.o
g++ $(CFLAGS) -o reciprocal main.o reciprocal.o
main.o: main.c reciprocal.h
gcc $(CFLAGS) -I./include -c main.c
reciprocal.o: reciprocal.cpp reciprocal.h
g++ $(CFLAGS) -I./include -c reciprocal.cpp
clean:
rm -f *.o reciprocal
我收到错误:
make:***无法制定目标reciprocal.h', needed by
main.o&#39;。停止。
我无法得到它是什么......
由于
答案 0 :(得分:0)
我们曾经在项目文件夹中创建三个文件夹:
因此Makefile看起来像:
obj:
mkdir obj
reciprocal: obj/main.o inc/reciprocal.h
g++ $(CFLAGS) -o reciprocal obj/main.o obj/reciprocal.o
obj/main.o: src/main.c inc/reciprocal.h
gcc $(CFLAGS) -c src/main.c -o obj/main.o
obj/reciprocal.o: src/reciprocal.cpp inc/reciprocal.h
g++ $(CFLAGS) -c src/reciprocal.cpp -o obj/reciprocal.o
clean:
rm -f *.o reciprocal
它更简单,我发现它被波兰的大多数程序员使用。
答案 1 :(得分:0)
传递给编译器的-I
选项将告诉编译器在哪里找到头文件。它没有告诉 make 在哪里找到任何东西:make不知道你已经将那个标志传递给了编译器。
它会打印出错误,因为它无法找到您的先决条件之一。
这是使用VPATH的好机会;只需添加:
VPATH = include
到你的makefile,现在make会查找先决条件并找到它们。