在C中静态使用readline(编译和链接)

时间:2016-05-15 15:50:38

标签: c makefile static-libraries readline

我想将readline与我的程序静态链接,我从源http://www.bioinf.org.uk/software/profit/doc/node17.html找到了关于readline编译的页面,但我对这个过程有点困惑。 该页面讨论了makefile中的变量READLINELIB,但我找不到它。

有人可以告诉我在程序中静态使用readline的方法,在Makefile中输入什么来从源代码编译readline并将其与我的程序链接?

谢谢。

2 个答案:

答案 0 :(得分:2)

最后,我找到了正确的方法,我使用 configure 文件的--prefix选项,我可以知道放置/安装库的位置。有关安装的问题是我没有权限访问除$HOME以外的其他目录,所以这样做没问题:

configure --prefix=$HOME/libreadline && make && make install-static

然后在我的程序中,我包含了来自$HOME/libreadline/include的文件。

要编译主程序,我将程序与归档库$HOME/libreadline/lib/libreadline.a$HOME/libreadline/lib/libhistory.a链接起来。

此外,由于readline文件使用的指令如#include <readline/readline.h>与文件的位置不对应,因此我必须告诉编译器在哪里查找包含的文件。为此,在运行gcc之前,我将变量C_INCLUDE_PATH设置为$HOME/libreadline/include

最后,由于readline使用ncurses动态库,我必须告诉编译器将它与我的程序动态链接。也许就是termcap的情况......

整个过程如下:

configure --prefix=$HOME/libreadline && make && make install-static
export C_INCLUDE_PATH=$HOME/libreadline/include
gcc -o myprogram myprogram.c $HOME/libreadline/lib/libreadline.a $HOME/libreadline/libhistory.a -lncurses -ltermcap

我对make install做了什么感到困惑,它只将文件复制到 configure 提供的位置,默认情况下它安装在 / usr / include <等系统目录中/ em>等等...但提供--prefix选项make install将复制指定目录中的所有文件。

安装只是将已编译的程序,库,doc等复制到某个位置,默认为standart系统目录,如果您无权访问像我这样的目录,您可以将它“安装”在您自己的目录中然后做任何你想做的事。

我本可以安装动态库而不是静态库,但是我必须修改LD_LIBRARY_PATH环境。

答案 1 :(得分:-1)

  1. 获取readline源

    wget http://git.savannah.gnu.org/cgit/readline.git/snapshot/readline-master.tar.gz
    
    tar zxvf readline-master.tar.gz
    
    cd readline-master/
    
  2. 示例文件夹没有Makefile,它是使用Makefile.in脚本生成的。 以下步骤构建静态&amp;动态库和&amp;将它们放在/ usr / local / bin

    ./configure
    make
    sudo make install
    
    • 可能必须将curses安装为“sudo apt-get install libncurses5-dev”
  3. 使用以下make文件(从examples文件夹中删除版本) (确保选项卡被尊重,否则makefile将无效)

    RM = rm -f
    CC = gcc
    CFLAGS = -g -O
    
    INCLUDES = -I/usr/local/include
    LDFLAGS = -g -L/usr/local/lib
    READLINE_LIB = -lreadline
    TERMCAP_LIB = -ltermcap
    
    .c.o:
        ${RM} $@
        $(CC) $(CFLAGS) $(INCLUDES) -c $<
    
    SOURCES = rlversion.c
    
    EXECUTABLES = rlversion
    
    OBJECTS = rlversion.o
    
    all: $(EXECUTABLES)
    everything: all
    
    rlversion: rlversion.o
        $(CC) $(LDFLAGS) -o $@ rlversion.o $(READLINE_LIB) $(TERMCAP_LIB)
    
    clean mostlyclean:
        $(RM) $(OBJECTS) $(OTHEROBJ)
        $(RM) $(EXECUTABLES)
    
    rlversion.o: rlversion.c