我是一名CS学生,正在学习如何使用C编程。我有3个文件和一个Makefile。我有


  逻辑.c逻辑.h main.c


logic.c的顶部是:

 #include "logic.h"
//use this function in 4 bit adder
//BIT full_adder(BIT A, BIT B, BIT Ci, BIT *Co);
int adder(int O1, int O2,  BIT carryIn, BIT *carryOut){
printf("in adder");
return 0x0;
}


BIT full_adder(BIT A, BIT B, BIT Ci, BIT *Co){
BIT S = FALSE;
    //implementation of if else's based on Truth Table <br>
    if((A==FALSE)&&(B==FALSE)&&(Ci==FALSE)){
        S=FALSE;
        *Co = FALSE;
    } <br>
    return S;
}


main.c的顶部是:

 #include "logic.h"
BIT full_adder(BIT A, BIT B, BIT Ci, BIT *Co);


在main.c中,我有我的主要功能,在主要功能的底部,我有:

 assert((full_adder(FALSE,FALSE,FALSE,&Co)==FALSE) && (Co==FALSE));
        adder(FALSE,FALSE,FALSE,&Co2);
    return 0;


我收到错误消息:

 main.o: In function 'main': main.c:158: undefined referenceto 'full_adder'

collect2: ld returned 1 exit status <br>
make: *** [pa3] Error 1 <br>
./bscript: line 3: pa3: command not found


这是家庭作业,但我在此问题上花费了大量时间,正在寻求帮助。我为加法器full_adder设置了正确的返回类型,并在logic.c和main.c的顶部声明了该函数。

没有回答我的问题的问题是:


Undefined Reference to a function
"Undefined reference to function" error


任何帮助表示赞赏。

编辑:
logic.c正在编译,并且确实创建了logic.o文件。

编辑:我的教授说我不能编辑逻辑。

编辑:makefile:

# Makefile template for CS 270 (specialized for PA3)

# List of files
C_SRCS      = main.c logic.c
C_OBJS      = main.o logic.o
C_HEADERS   = logic.h
OBJS        = ${C_OBJS}
EXE         = pa3

# Compiler and loader commands and flags
GCC         = gcc
GCC_FLAGS   = -g -std=c99 -Wall -O0 -c
LD_FLAGS    = -g -std=c99 -Wall -O0
# Target is the executable
pa3 : $(OBJS)
    @echo "Linking all object modules ..."
    $(GCC) $(LD_FLAGS) $(OBJS) -o $(EXE)
    @echo ""
# Recompile C objects if headers change
${C_OBJS}:      ${C_HEADERS}
# Compile .c files to .o files
.c.o:
    @echo "Compiling each C source file separately ..."
    $(GCC) $(GCC_FLAGS) $<
    @echo ""

# Clean up the directory
clean:
    @echo "Cleaning up project directory ..."
    rm -f *.o $(EXE) core a.out
    @echo ""


编辑:我用脚本编译代码:

#!/usr/bin/sh
make
pa3

最佳答案

首先,将定义与声明分开:

logic.h:

#ifndef _LOGIC_H_
#define _LOGIC_H_

/* Define BIT as before */

int adder(int O1, int O2,  BIT carryIn, BIT *carryOut);
BIT full_adder(BIT A, BIT B, BIT Ci, BIT *Co);


#endif


逻辑c:

#include <stdio.h>
#include "logic.h"

int adder(int O1, int O2,  BIT carryIn, BIT *carryOut){
  printf("in adder");
  return 0x0;
}

BIT full_adder(BIT A, BIT B, BIT Ci, BIT *Co){
  BIT S = FALSE;
  //implementation of if else's based on Truth Table
  if((A==FALSE)&&(B==FALSE)&&(Ci==FALSE)){
    S=FALSE;
    *Co = FALSE;
  }

  return S;
}


main.c:

#include "logic.h"

int main(int argc, char* argv[]) {
  /* Do your stuff */
  return 0;
}


现在一切就绪,您的logic.h将所需的信息提供给编译器。

仅使用这三个文件,您的makefile不需要任何奇特的东西。

这需要通过makefile完成:

gcc -c -o main.o main.c
gcc -c -o logic.o logic.c
gcc -o main main.o logic.o


(您在full_adder中遇到的逻辑问题留给您解决...)

关于c - 未定义对称为“full_adder(BIT A,BIT B,BIT Ci,BIT * Co)的函数”的引用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12516019/

10-10 20:32