0

私はCでプログラミングする方法を学んでいるCSの学生です。3つのファイルと1つの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の上部は次のとおりです。

 #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

これは宿題ですが、私はこの問題にかなりの時間を費やし、助けを求めています。adder、full_adderの正しい戻り型があり、logic.cとmain.cの両方の先頭で関数を宣言します。

私の質問に答えなかった質問は次のとおりです。

どんな助けでも大歓迎です。

編集:logic.cがコンパイルされ、logic.oファイルが作成されます。

編集:私の教授は、logic.hを編集できないと言っています

編集: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
4

2 に答える 2

0

まず、定義を宣言から分離します。

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

logic.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これらの3つのファイルだけで派手なものは必要ありません。

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で1回だけ発生する必要があります。

発生するエラーはリンカーからのものです。

Makefileの外でコンパイル/リンクしてみてください。

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