每个人都在那里写一个非常简单的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命令来运行项目?请给我一个详细的说明
答案 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)
让我们根据依赖关系来审核您的流程:
你告诉gcc将div,mul和sum编译成目标代码(.o
)。
告诉gcc将exp编译成二进制代码。
问题是当你做(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);