Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对名为'的函数的未定义引用;全加器(A位、B位、Ci位、Co位)和x27;_C_Undefined Reference - Fatal编程技术网

对名为'的函数的未定义引用;全加器(A位、B位、Ci位、Co位)和x27;

对名为'的函数的未定义引用;全加器(A位、B位、Ci位、Co位)和x27;,c,undefined-reference,C,Undefined Reference,我是一名CS学生,正在学习如何用C语言编程。我有3个文件和一个Makefile。我有 logic.c logic.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("i

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

logic.c logic.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中我有我的main函数,在main函数的底部我有:

 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

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

逻辑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;
}
现在事情已经到了应该的位置,您的
逻辑.h
为编译器提供了所需的信息

您的
makefile
不应该只需要这三个文件就需要任何花哨的东西

这需要通过
makefile
完成:

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

(您的
全加器中的逻辑问题留给您解决…

我看到链接器没有根据对象文件的顺序查找/查找函数。 在makefile中,您可能希望尝试更改顺序:

C_OBJS      = logic.o main.o 
我在logic.c和main.c的顶部声明函数

功能原型

BIT full_adder(BIT A, BIT B, BIT Ci, BIT *Co);
在逻辑中,应该只发生一次

您收到的错误来自链接器

您可能只想尝试在Makefile外部编译/链接它:

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

我假设他们都想让你发布makefile,你真的在实现
全加器吗
?请展示你是如何编译代码的?显示您的makefile?@H2CO3我想您的意思是“我正在制作一个全加器的逻辑表示吗?”是的。很多不是门和与门,最终我将制作一个4位加法器。至少我的答案对
logic.h
文件没有任何更改。我只是加入了它的一个精简版本,以显示事情的发展方向,仅此而已。您是否尝试过对
logic.c
main.c
进行建议的更改?
gcc -c -o main.o main.c
gcc -c -o logic.o logic.c
gcc -o main main.o logic.o
C_OBJS      = logic.o main.o 
BIT full_adder(BIT A, BIT B, BIT Ci, BIT *Co);
gcc -c logic.c
gcc -o main main.c logic.o