如何在Makefile中使用-I选项

时间:2015-07-26 12:41:37

标签: ubuntu makefile

编辑:

我现在知道如何使用@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;。停止。 我无法得到它是什么......

由于

2 个答案:

答案 0 :(得分:0)

我们曾经在项目文件夹中创建三个文件夹:

  1. headers(inc /)
  2. 源文件(src /)
  3. 目标文件(obj /)
  4. 因此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会查找先决条件并找到它们。