2016-03-08 19 views
-1

我真的很簡單的程序,檢查該用戶類型是迴文詞:(我知道,這個程序可以寫好多了,但讓我們離開那個放在一邊)

我必須使用readline函數來獲得用戶輸入或創建我自己的,但因爲我沒有足夠的知識來創建我自己的我正在使用readline。Ubuntu的的ReadLine()和生成文件

#include <stdio.h> 
#include <stdlib.h> 
#include <readline/readline.h> 
#include <readline/history.h> 

int IsPalindrome(char* niz) 
{ 

int y=0; 
int n=0; 
int i; 
for(i=1;i<strlen(niz)/2+1;i++) 
{ 
    if(niz[i-1]==niz[strlen(niz)-i]){ 
    y++; 
    } 
    else{ 
    n++; 
    } 

} 
    if(n>0){ 
    return 0; 
    } 
    else{ 
    return 1; 
    } 
} 

int main() 
{ 
    char *inpt; 

    inpt = readline("enter text: "); 
    if(IsPalindrome(inpt)==1) 
    { 
     printf("\nIs palindrome\n"); 
    } 
    else{ 
     printf("\nNot palindrome\n"); 
    } 

return 0; 
} 

我使用的代碼::塊,如果我點擊「生成和運行」我得到以下錯誤:

未定義的引用「的ReadLine」

我必須編譯然後用makefile從終端運行我的程序,這是我迷路的地方。我最近剛開始使用Ubuntu,因此我對這件事以及它的工作原理並不十分了解。

現在我必須用makefile編譯我的程序(全部運行)。這是生成文件,我們可以使用(我在大學,我們拿到的這款爲幫助),我們只需要改變一些數據(名的程序,添加一些標誌):

GCC=gcc 
CFLAGS=-c -g 
LFLAGS=-lreadline 
EXE=main 

all: ${EXE}.o 
    ${GCC} ${LFLAGS} ${EXE}.o -o ${EXE} 

${EXE}.o: ${EXE}.c 
    ${GCC} ${CFLAGS} ${EXE}.c 

clean: 
    rm -rf *.o 
    rm -rf ${EXE} 

現在因爲我正在使用readline函數,我添加了標誌-lreadline並將我的程序的名稱添加到EXE = main(我的程序被稱爲main.c),但是如果我運行makefile(make all),我得到以下錯誤:

make all 
gcc -lreadline main.o -o main 
main.o: In function `main': 
/home/yack/Desktop/NPO/Palindrom/Palindrom/main.c:67: undefined reference to `readline' 
collect2: error: ld returned 1 exit status 
Makefile:7: recipe for target 'all' failed 
make: *** [all] Error 1 

我安裝的Readline-6.3和我讀在互聯網上,我必須以某種方式連接的readline告訴編譯器它或東西,但看起來增加-lreadline標誌是不夠的。

昨天我找到臨時的解決辦法,這樣,如果我的程序與此命令的工作我可以測試:

gcc main.c -L/usr/local/lib -I/usr/local/include -lreadline -c -g 


使用此命令,我設法創建可執行文件和測試,如果我的程序工作,但今天甚至不再有效。

注:
我必須從makefile文件編譯程序,在終端中的最後一個命令只是爲了檢查我的程序工作,因爲我的makefile沒有工作。

我在做什麼錯?

+2

請勿發佈圖片文字!改爲過去的文字。 – Olaf

+0

@Olaf對不起,我認爲如果我發佈了什麼終端輸出的圖片,錯誤會更好理解。 – yack

+0

什麼讓你將文本粘貼爲文本?對不起,這是一個蹩腳的藉口。 – Olaf

回答

1

傳遞給GCC(和鏈接器)的參數的順序是相關的。

你的Makefile中應該使用libreadline的到來之前,你實際上LFLAGS鏈接libreadline,就像這樣:

GCC=gcc 
CFLAGS=-c -g 
LFLAGS=-lreadline 
EXE=main 

all: ${EXE}.o 
    ${GCC} ${EXE}.o -o ${EXE} ${LFLAGS} 

${EXE}.o: ${EXE}.c 
    ${GCC} ${CFLAGS} ${EXE}.c 

clean: 
    rm -rf *.o 
    rm -rf ${EXE} 

在你的「臨時的解決辦法」,你固定的順序,這就是爲什麼它工作了您。

+0

Ty現在它創建了一個可執行文件,但是當我想執行它時:./main我得到這個錯誤: – yack

+0

符號查找錯誤:/usr/local/lib/libreadline.so.6:undefined symbol:UP 任何想法那可能是什麼? – yack

+0

它看起來像你的readline安裝有些問題,但這與你的C代碼或鏈接無關。你可能試過通過Ubuntu儲存庫之外的其他機制來安裝readline?如果您想要最簡單的路徑轉發,您需要清除/刪除以此方式安裝的任何readline,以及apt-get install libreadline-dev。 –