标题lab3p2.h
#ifndef LAB3P2_H
#define LAB3P2_H
long power(int integer1, int integer2);
#endif
电源功能:lab3p2f1.c
#include "lab3p2.h"
#include <stdio.h>
long power(int integer1, int integer2){
int i;
long ret =(long) integer1;
if(integer2 ==0)
{
ret = 1;
}else{
for( i =1 ; i < integer2; i++)
{
ret = ret * integer1;
}
}
return ret;
}
主要:lab3p2.c
#include <stdio.h>
#include "lab3p2.h"
/*Takes in integers from the command line and returns the power function result*/
int main(int argc, char **argv){
int a = atoi( *(argv+1));
int b = atoi( *(argv+2));
int c =atoi( *(argv+3));
long functionResult;
functionResult = power(b,c);
printf("The result of the power function is %ld \n", functionResult);
}
MakeFile:生成文件
all: lab3p2
mkprog: lab3p2.o lab3p2f1.o
gcc lab3p2.o lab3p2f1.o -o lab3p2
lab3p2.o: lab3p2.c
gcc -ansi -pedantic -c lab3p2.c
lab3p2f1.o: lab3p2f1.c
gcc -ansi -pedantic -c lab3p2f1.c
clean:
rm -rf *.o lab3p2
为什么主机不能访问该功能?
我的编译方式有问题吗?
任何帮助都非常感谢。
最佳答案
您缺少targetlab3p2
的规则;即mkprog
应为lab3p2
:
all: lab3p2
lab3p2: lab3p2.o lab3p2f1.o
gcc lab3p2.o lab3p2f1.o -o lab3p2
lab3p2.o: lab3p2.c
gcc -ansi -pedantic -c lab3p2.c
lab3p2f1.o: lab3p2f1.c
gcc -ansi -pedantic -c lab3p2f1.c
clean:
rm -rf *.o lab3p2
使用当前的
Makefile
,当您在没有参数的情况下运行make
时,将得到以下输出:% make
gcc -ansi -pedantic -c lab3p2.c
cc lab3p2.o -o lab3p2
lab3p2.o: In function `main':
lab3p2.c:(.text+0x6b): undefined reference to `power'
collect2: error: ld returned 1 exit status
<builtin>: recipe for target 'lab3p2' failed
make: *** [lab3p2] Error 1
结果是make试图满足第一个目标(即
all
);这就需要lab3p2
。由于make找不到显式规则来构建lab3p2
,因此它会尝试隐式规则-它知道可以通过将foo
链接到程序来构建foo.o
;因此它运行命令cc lab3p2.o -o lab3p2
但是,此命令不会链接到
lab3p2f1.o
的定义所在的power
中。这些隐式规则对于简单的项目非常方便;例如,对于您的项目,GNU make的Makefile可以简单地编写为
CC = gcc
CFLAGS = -ansi -pedantic
all: lab3p2
lab3p2: lab3p2.o lab3p2f1.o
clean:
rm -rf *.o lab3p2
make将自动找出如何从相应的
.o
中构建.c
,并且应该使用CC
变量中的编译器,并从CFLAGS
中传递参数。