首页 文章

Ubuntu readline()和makefile

提问于
浏览
-1

我有一个非常简单的程序,用于检查用户输入的单词是否为回文:(我知道这个程序可以编写得更好但是现在让我们把它放在一边)

我必须使用readline函数来获取用户输入或创建我自己的,但因为我不是't have enough knowledge to create my own I' m使用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;
}

我正在使用Code :: Blocks,如果我点击"build and run",我会收到以下错误:

未定义的引用'readline'

我必须编译然后使用makefile从终端运行我的程序,这是我真正了解它以及它如何工作的地方 .

现在我必须使用makefile编译我的程序(全部在运行中) . 这是我们可以使用的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不起作用 .

我究竟做错了什么 ?

1 回答

  • 1

    传递给GCC(和链接器)的参数顺序是相关的 .

    你的Makefile应该使用libreadline来实际链接libreadline和 LFLAGS ,如下所示:

    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}
    

    在您的“临时修复”中,您修复了订单,这就是为什么它适合您 .

相关问题