2017-02-23 25 views
1

部首lab3p2.h基本生成文件的程序:在主錯誤未定義提及 「功率」

#ifndef LAB3P2_H 
#define LAB3P2_H 

long power(int integer1, int integer2); 

#endif 

冪函數:lab3p2f1.c

#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; 
} 

主: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: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;即mkprog應該lab3p2

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 

以您目前的Makefile,當你不帶參數運行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 

什麼情況是,make試圖滿足第一個目標(即all);這然後需要lab3p2。因爲make找不到明確的規則來構建lab3p2它然後嘗試一個隱式的 - 它知道可以通過將foo.o鏈接到程序來構建foo;因而它運行命令

cc lab3p2.o -o lab3p2 

然而,此命令不會在lab3p2f1.o鏈接其中定義power駐留。


這些隱式規則對於簡單的項目可能非常方便;例如,對於您的項目,爲GNU Makefile文件使可以簡單地寫爲

CC = gcc 
CFLAGS = -ansi -pedantic 

all: lab3p2 

lab3p2: lab3p2.o lab3p2f1.o 

clean: 
     rm -rf *.o lab3p2 

,並會自動計算出如何從相應.c建立.o,它應該使用來自CC變量的編譯器和從CFLAGS傳遞參數。

+0

謝謝修復它 – jsho