makefile和c项目

时间:2011-04-27 05:34:47

标签: c makefile

每个人都在那里写一个非常简单的c代码,其中包括:

#include<stdio.h>
int sum(int x ,int y);
int mult(int x, int y);
int div(int x , int y);
int main()
{
    int a,b,s,m,d;
    system("clear");
     a =20;
     b =40;
    s=sum(a,b);
    m=mul(a,b);
    d=div(a,b);
    printf("\n the sum of given no. = %d\nThe product of given no. = %d\nThe division of given no = %d",s,m,d);
    return 0;
}

文件的名称是exp.c而不是我写下面的代码:

#include<stdio.h>
int sum( int x ,int y)
{
   int z;
   z=x+y;
   return z;
}

我把它保存为sum.c而不是写下面的代码:

#include<stdio.h>
int mult( int z ,int u)
{
   int v ;
   v=z*u;
   return v;
}

将其保存为mul.c,而不是编写以下代码

#include<stdio.h>
int div (int a, int b)
{ 
   int f;
   f=a/b;
   return f;
}

将其另存为div .c

我想将所有文件用作单个项目。我希望exp.c使用mul.c,div.c,sum.c中定义的函数。所以我写了一个makefile,该项目如下:

fun : exp.c
    gcc exp.c

exp.c : sum.o mul.o div.o

sum.o :sum.c
    gcc -c sum.c

mul.o :mul.c
    gcc -c product.c

div.o : div.c
    gcc -c div.c

现在我的问题是我运行make命令后出现以下错误:

exp.c:(.text+0x31): undefined reference to `sum'
exp.c:(.text+0x43): undefined reference to `mult'

我做错了什么?

我需要头文件吗?

如何在没有头文件的情况下执行此操作?

如何在没有make文件的情况下执行程序?

如何使用gcc -o sum.c mul.c,div.c命令来运行项目?请给我一个详细的说明

4 个答案:

答案 0 :(得分:3)

简单方法:

fun:
    gcc -o fun exp.c sum.c div.c product.c

长期的方式:

fun: exp.o sum.o mul.o div.o
    gcc -o fun exp.o sum.o mul.o div.o

%.o: %.c
    gcc -c $< -o $@

第二种方法神奇地接受任何.c文件并将它们编译成正确的.o文件,因此您不需要为每个新文件创建一个新目标。

答案 1 :(得分:1)

让我们根据依赖关系来审核您的流程:

  1. 你告诉gcc将div,mul和sum编译成目标代码(.o)。

  2. 告诉gcc将exp编译成二进制代码。

  3. 问题是当你做(2)时,你没有向gcc提供在(1)中生成的目标文件。你告诉它只编译exp。这就是你的功能链接失败的原因。

    将所有内容编译为.o,然后将所有生成的对象作为参数运行gcc,而不仅仅是主源文件。

答案 2 :(得分:0)

这是您的程序的make文件

all: exp.c sum.o mul.o div.o
     gcc -o exp exp.c sum.o mul.o div.o
sum.o: sum.c
     gcc -o sum.o -c sum.c
mul.o: mul.c
     gcc -o mul.o -c mul.c
div.o: div.c
     gcc -o div.o -c div.c

在此之后,您必须通过执行命令

来运行程序
make all

答案 3 :(得分:0)

尝试这个通用的makefile,我写回来的时候,你可以将它用于任何项目,只要所有文件都在Makefile所在的目录中。

P_NAME := <your program name>
P_C_SRCS := $(wildcard *.c)
P_C_OBJS := ${P_C_SRCS:.c=.o}
P_INCLUDE_DIRS := <path to include dir>
 P_LIBRARY_DIRS := <path to lib dir>
P_LIBRARIES := <library name >
CPPFLAGS += $(foreach includedir,$(P_INCLUDE_DIRS),-I$(includedir))
LDFLAGS += $(foreach librarydir,$(P_LIBRARY_DIRS),-L$(librarydir))
LDFLAGS += $(foreach library,$(P_LIBRARIES),-l$(library))
CC := gcc -Wall -g
CCFLAGS := -Wall -g

.PHONY: all clean
all: $(P_NAME)
$(P_NAME): $(P_C_OBJS)
$(CC) $(CCFLAGS) $(P_C_OBJS) -o $(P_NAME) $(LDFLAGS)
clean:
@- $(RM) $(P_NAME)
@- $(RM) $(P_C_OBJS)
@- $(RM) core*
@- $(RM) tags

您的exp.c语法错误m=mul(a,b);应为m=mult(a,b);