【问题标题】:Ubuntu readline() and makefilesUbuntu readline() 和生成文件
【发布时间】:2016-03-08 21:08:12
【问题描述】:

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

我必须使用 readline 函数来获取用户输入或创建自己的函数,但因为我没有足够的知识来创建自己的函数,所以我正在使用 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,如果我点击“构建并运行”,我会收到以下错误:

未定义对“readline”的引用

我必须使用makefile从终端编译然后运行我的程序,这就是我迷路的地方。我最近才开始使用 Ubuntu,所以我不太了解它以及它是如何工作的。

现在我必须用 makefile ( all in run ) 编译我的程序。这是我们可以使用的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=ma​​in (我的程序称为 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没有工作。

我做错了什么?

【问题讨论】:

  • 不要发布文字图片!而是过去文本。
  • @Olaf 对不起,我认为如果我发布终端输出的图片会更好地理解错误。
  • 是什么阻止您将文本粘贴为文本?对不起,这是一个蹩脚的借口。
  • @Olaf 我会在接下来的问题中记住这一点,再次抱歉,我不知道我不应该这样做。
  • 不要只是“记住下一个问题”,而是请编辑您的当前问题。

标签: c linux ubuntu makefile


【解决方案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}

在您的“临时修复”中,您修复了排序,这就是它对您有用的原因。

【讨论】:

  • 现在它创建了一个可执行文件,但是当我想使用以下命令执行它时:./main 我收到此错误:
  • 符号查找错误:/usr/local/lib/libreadline.so.6: undefined symbol: UP 知道这可能是什么吗?
  • 您的 readline 安装似乎有些问题,但这与您的 C 代码或链接无关。您可能尝试通过 Ubuntu 存储库以外的其他机制安装 readline?如果您想要最简单的前进路径,您将需要清理/删除以这种方式安装的任何 readline,并 apt-get install libreadline-dev。
  • 我下载了 .tar.gz -> 解压它 -> 并使用命令安装 -> ./configure -> 以及安装信息中发布的所有其他内容。我将尝试再次安装它,但我很高兴我的 makefile 现在非常有效。
  • 我们在这里偏离了范围,但请尝试apt-get install libreadline-dev。删除 /usr/local/include/readline(dir with contents)、/usr/local/lib/libreadline*/usr/local/lib/libhistory*
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多