0

我是一名 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 的顶部声明了该函数。

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

任何帮助表示赞赏。

编辑: logic.c 正在编译,它确实创建了一个 logic.o 文件。

编辑:我的教授说我不能编辑 logic.h

编辑:生成文件:

# 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
4

2 回答 2

0

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

逻辑.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;
}

主.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留给你解决......)

于 2012-09-20T15:50:57.427 回答
0

我已经看到链接器根据目标文件的顺序找不到/查找函数。在您的 makefile 中,您可能想尝试更改顺序:

C_OBJS      = logic.o main.o 

我在 logic.c 和 main.c 的顶部声明了该函数。

函数原型

BIT full_adder(BIT A, BIT B, BIT Ci, BIT *Co);

应该只出现一次,在 logic.h 中。

您得到的错误来自链接器。

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

gcc -c logic.c
gcc -o main main.c logic.o
于 2012-09-20T15:53:10.050 回答