【问题标题】:Getting a C error that I have an undefined reference to function, but the function is defined得到一个 C 错误,我有一个未定义的函数引用,但函数已定义
【发布时间】: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

标签: c makefile


【解决方案1】:

该错误是因为您在构建main 时没有链接btod.o。这就是 GNU Make 所需要的一切:

.PHONY: all clean
CFLAGS = -g -Wall

all: main

clean:
    rm -f *.o main

main: btod.o main.o

【讨论】:

    猜你喜欢
    • 2022-05-03
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多