【发布时间】:2022-11-01 13:48:13
【问题描述】:
我试图从我的 main.c 文件中取出一个二进制到十进制的函数并放入它自己的文件中,但是当我用我的 makefile 编译文件时,我得到了错误:
undefined reference to `btod'
这是我的 main.c 文件:
#include "btod.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int n;
printf("\nEnter a binary number: ");
char c[100];
scanf("%s",c);
printf("Number converted to decimal: %d\n\n\n",btod(strlen(c),c));
return 0;
}
这是我的 btod.c 文件:
#include <stdlib.h>
#include <string.h>
int btod(int size,char inputBin[size])
{
int i,num=0;
for(i=0;i<size;i++)
{
num=num*2+(inputBin[i]-48);
}
return num;
}
这是我的 btod.h 文件:
int btod(int size,char inputBin[size]);
最后,这是我的生成文件:
CC = gcc
INCLUDE = -I.
CFLAGS = -g -Wall
LDFLAGS = -L. \
-L/usr/lib
LDLIBS = \
-lc -lm
.c.o:
$(CC) $(INCLUDE) $(CFLAGS) -c $<
all: main
main: main.o
$(CC) -o $@ $^ $(LDFLAGS) $(LDLIBS)
btod: btod.o
$(CC) -o $@ $^ $(LDFLAGS) $(LDLIBS)
clean:
rm -f *.o
rm -f main
我认为这可能与未在 makefile 中正确编译的 btod.c 文件有关,但我无法弄清楚它的不正确之处。
【问题讨论】:
-
删除
btod:部分并制作另一个main: main.o btod.o -
您的 makefile 可能是 simplified 很多。
-
也请尽量避免magic numbers。如果
48是指'0'的ASCII 值,请改用实际字符'0'。您可能应该添加一些验证以确保输入字符串确实只有'0'和'1'。并确保您不会溢出结果num。