我想将readline与我的程序静态链接,我从源http://www.bioinf.org.uk/software/profit/doc/node17.html找到了关于readline编译的页面,但我对这个过程有点困惑。
该页面讨论了makefile中的变量READLINELIB
,但我找不到它。
有人可以告诉我在程序中静态使用readline的方法,在Makefile中输入什么来从源代码编译readline并将其与我的程序链接?
谢谢。
答案 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)
获取readline源
wget http://git.savannah.gnu.org/cgit/readline.git/snapshot/readline-master.tar.gz
tar zxvf readline-master.tar.gz
cd readline-master/
示例文件夹没有Makefile,它是使用Makefile.in脚本生成的。 以下步骤构建静态&amp;动态库和&amp;将它们放在/ usr / local / bin
中./configure
make
sudo make install
使用以下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