2017-02-23 22 views
1

ヘッダーlab3p2.h基本的なメイクプログラム:メインエラー未定義の参照中に "電源"

#ifndef LAB3P2_H 
#define LAB3P2_H 

long power(int integer1, int integer2); 

#endif 

電源機能:

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

long power(int integer1, int integer2){ 
    int i; 
    long ret =(long) integer1; 
    if(integer2 ==0) 
    { 
      ret = 1; 
    }else{ 
      for(i =1 ; i < integer2; i++) 
      { 
       ret = ret * integer1; 
      } 
    } 
    return ret; 
} 

メインlab3p2f1.c:lab3p2.c

#include <stdio.h> 
#include "lab3p2.h" 
/*Takes in integers from the command line and returns the power function result*/ 
int main(int argc, char **argv){ 
    int a = atoi(*(argv+1)); 
    int b = atoi(*(argv+2)); 
    int c =atoi(*(argv+3)); 
    long functionResult; 

    functionResult = power(b,c);    
    printf("The result of the power function is %ld \n", functionResult); 
} 

MakeFile:メイクファイル

all: lab3p2 
mkprog: lab3p2.o lab3p2f1.o 
    gcc lab3p2.o lab3p2f1.o -o lab3p2 
lab3p2.o: lab3p2.c 
    gcc -ansi -pedantic -c lab3p2.c 
lab3p2f1.o: lab3p2f1.c 
    gcc -ansi -pedantic -c lab3p2f1.c 
clean: 
    rm -rf *.o lab3p2 

なぜメインは機能にアクセスできませんか? 私はどのようにコンパイルしていますか? 何か助けていただければ幸いです。

+2

ビルドログを表示してください。また、CとC++は異なる言語であることに注意してください。関連タグのみを使用してください(この場合はCと思われます)。 – kaylum

+1

'make'や' make mkprog'だけでmakefileを起動していますか? – StoryTeller

+0

'long'は' int'よりも広い範囲を持つと思いますか?そして、タグをスパムしないでください。これは明らかにCとしてコンパイルされています。 – Olaf

答えて

2

ターゲットlab3p2のルールがありません。すなわちmkproglab3p2する必要があります:あなたの現在のMakefile

all: lab3p2 

lab3p2: lab3p2.o lab3p2f1.o 
     gcc lab3p2.o lab3p2f1.o -o lab3p2 

lab3p2.o: lab3p2.c 
     gcc -ansi -pedantic -c lab3p2.c 

lab3p2f1.o: lab3p2f1.c 
     gcc -ansi -pedantic -c lab3p2f1.c 

clean: 
     rm -rf *.o lab3p2 

、あなたが引数なしでmakeを実行すると、次の出力を取得します:

% make 
gcc -ansi -pedantic -c lab3p2.c 
cc lab3p2.o -o lab3p2 
lab3p2.o: In function `main': 
lab3p2.c:(.text+0x6b): undefined reference to `power' 
collect2: error: ld returned 1 exit status 
<builtin>: recipe for target 'lab3p2' failed 
make: *** [lab3p2] Error 1 

は何が起こることは、メイクを満たすためにしようとするものであるが最初のターゲット(すなわちall)。これにはlab3p2が必要です。 makeは明示的なの構築ルールを見つけることができないので、lab3p2を暗黙的に試してみると、プログラムにfoo.oをリンクしてfooをビルドできることがわかります。したがって、コマンドに

cc lab3p2.o -o lab3p2 

を実行しかし、このコマンドはpower存在の定義lab3p2f1.oにリンクしません。


これらの暗黙のルールは、単純なプロジェクトでは非常に便利です。あなたのプロジェクトのために、たとえば、GNU makeをのためのMakefileは単に

CC = gcc 
CFLAGS = -ansi -pedantic 

all: lab3p2 

lab3p2: lab3p2.o lab3p2f1.o 

clean: 
     rm -rf *.o lab3p2 

として書かれており、自動的に.c対応から.oを構築する方法を見つけ出すと、それはCC変数からコンパイラを使用する必要があることでしょう作ることができ、 CFLAGSからの引数を渡します。

+0

ありがとうございました – jsho