c - 初学者的 Makefile

标签 c makefile dependencies

我刚开始学习 makefile:我自己创建了一个简单的教程,但似乎我在某个地方弄错了,我不知道在哪里;我的迷你教程由 main.c 脚本组成,该脚本调用名为 kernel.c 的函数;在最后一个函数中,调用了另外 2 个函数:add.c(将 2 个数字相加)和 mul.c(将前一个总和的结果相乘);然后我创建了头文件 kernel.hfunctions.h,其中包含上面定义的函数的原型(prototype);这两个 header 包含在同一个 main.c 脚本中创建的文件夹中:common/inc

文件如下:

//main
#include <stdio.h>
#include <stdlib.h>
#include "kernel.h"

int main(){
int a = 5, b = 4, c = 0;
int *pa, *pb, *pc;
pa = &a; pb = &b; pc = &c;

kernel(pa, pb, pc);

printf("c = %d\n", c);

return 0;
}

这里是kernel.c

#include "kernel.h"
#include "functions.h"

void kernel(int* a, int*b, int* c){
 int x = add(*a,*b);
 *c = mul(x);
}

这里是add.c

#include "functions.h"

int add(int a, int b){
return a + b;
}

这里是mul.c

#include "functions.h"

int mul(int a){
return a*2;
}

这里是kernel.h

void kernel(int* a, int*b, int* c);

这里是functions.h

int add(int a, int b);
int mul(int a);

我写的 make 文件是这样的:

#===========================Makefile================================#

CC=gcc
IDIR = common/inc
CFLAGS=-c -Wall -I$(IDIR)

all: eseguibile

eseguibile: main.o  
    $(CC) $(CFLAGS) main.o -o eseguibile

main.o: main.c kernel.o
    $(CC) $(CFLAGS) main.c kernel.o

kernel.o: kernel.c add.o mul.o
    $(CC) $(CFLAGS) kernel.c add.o mul.o

add.o: add.c 
    $(CC) $(CFLAGS) add.c

mul.o: mul.c 
    $(CC) $(CFLAGS) mul.c

clean:
    rm -rf *o eseguibile

我知道该程序可以正常工作,因为如果我在终端中键入 gcc main.c kernel.c add.c mul.c -I common/inc/ 一切正常。

谁能告诉我我做错了什么?`

我得到的错误是这样的:

gcc -c -Wall -Icommon/inc add.c
gcc -c -Wall -Icommon/inc mul.c
gcc -c -Wall -Icommon/inc kernel.c add.o mul.o
gcc: warning: add.o: linker input file unused because linking not done
gcc: warning: mul.o: linker input file unused because linking not done
gcc -c -Wall -Icommon/inc main.c kernel.o
gcc: warning: kernel.o: linker input file unused because linking not done
gcc -c -Wall -Icommon/inc main.o -o eseguibile
gcc: warning: main.o: linker input file unused because linking not done

最佳答案

我更喜欢分别构建对象,然后在最后将它们全部组合起来。我认为问题在于您在最终可执行文件中包含了一个 -c 标志。试试这个:

#===========================Makefile================================#

CC=gcc
IDIR = common/inc
CFLAGS=-Wall -I$(IDIR)
OBJS = main.o kernel.o add.o mul.o

all: eseguibile

eseguibile: $(OBJS)
    $(CC) $(CFLAGS) $^ -o eseguibile

main.o: main.c kernel.h
    $(CC) -c $(CFLAGS) main.c

kernel.o: kernel.c kernel.h functions.h
    $(CC) -c $(CFLAGS) kernel.c

add.o: add.c functions.h
    $(CC) -c $(CFLAGS) add.c

mul.o: mul.c functions.h
    $(CC) -c $(CFLAGS) mul.c

clean:
    rm -rf *.o eseguibile

关于c - 初学者的 Makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27453171/

相关文章:

javascript - 如何在 Windows 上使用 MAKE 构建项目? (它从源 JS 文件构建输出)

java - 如何在 pom.xml 添加依赖项之类的文件夹

java - 以编程方式使用 IVY 依赖管理器

c - 如何在C中传递一个字符串作为参数,然后返回一个字符串

c++ - |= 在 C++ 中是什么意思?

c - 替代c中的多维数组

linux - shell 和 makefile 之间的公共(public) "include"文件

c++ - 使用CMake和Make编译时OpenCV库错误: cannot find -lopencv_bgsegm

c++ - 使用cmake编译CSDP

compiler-construction - opa:无法编译 hello chat 演示(另一个错误)