2016-05-15 4 views
0

Ich möchte statisch readline mit meinem Programm verknüpfen und ich habe diese Seite über Readline Compilation aus Quelle http://www.bioinf.org.uk/software/profit/doc/node17.html gefunden, aber ich bin ein wenig verwirrt über den Prozess. Die Seite spricht über eine Variable READLINELIB im Makefile, aber ich finde es nicht.Mit readline statisch in C (Kompilierung und Verknüpfung)

Kann mir jemand den Weg zeigen, readline statisch in meinem Programm zu verwenden, was in mein Makefile zum Kompilieren von readline aus der Quelle zu setzen und es mit meinem Programm zu verknüpfen?

Vielen Dank.

+0

„Die Make-Datei“ bezeichnete in dieser Seite ist die Make-Datei für ProFit, nicht die Make-Datei für die Readline-Bibliothek. Um Readline aus der Quelle zu kompilieren, müssen Sie die Readline-Quelle holen und sie dann kompilieren - Sie können sie nicht aus der Quelle kompilieren, indem Sie etwas in Ihr * eigenes * Makefile einfügen. Wenn Sie Linux verwenden, ist die Wahrscheinlichkeit groß, dass Sie die statischen Bibliotheken einfach von Ihrem Paketmanager abrufen können, ohne sie kompilieren zu müssen. –

+0

Readline kommt mit einem * configure * und * Makefile *, um es zu kompilieren muss ich nur 'configure' und' make' ausführen ohne die 'make install'? Was ist das Ergebnis von 'configure && make' und was macht' make install'? Ich habe versucht, es zu verstehen, indem ich das Makefile lese, aber es ist ziemlich komplex. –

+0

'configure' generiert automatisch das Makefile,' make' erstellt die Bibliothek und 'make install' installiert es. Sie werden alle drei Dinge tun müssen - wenn Sie readline verwenden möchten, gibt es keinen Grund, es nicht zu installieren. Sie müssen das Makefile nicht verstehen - Sie müssen nur die Installationsanweisungen verstehen und befolgen. –

Antwort

-1
  1. erhalten Readline- Quelle

    wget http://git.savannah.gnu.org/cgit/readline.git/snapshot/readline-master.tar.gz 
    
    tar zxvf readline-master.tar.gz 
    
    cd readline-master/ 
    
  2. Beispiele Ordner nicht Makefile haben, die Makefile.in Skript erzeugt wird, verwendet wird. folgenden Schritte bauen statische & dynamische Libs & setzt sie innen/usr/local/bin

    ./configure 
    make 
    sudo make install 
    
    • müssen Flüche wie "sudo apt-get install libncurses5-dev" installieren kann
  3. Verwenden Sie folgende make-Datei (strip down Version aus Beispielen Ordner) (Stellen Sie sicher, Registerkarte wird anders geehrt, sonst Makefile wird nicht funktionieren)

    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} [email protected] 
        $(CC) $(CFLAGS) $(INCLUDES) -c $< 
    
    SOURCES = rlversion.c 
    
    EXECUTABLES = rlversion 
    
    OBJECTS = rlversion.o 
    
    all: $(EXECUTABLES) 
    everything: all 
    
    rlversion: rlversion.o 
        $(CC) $(LDFLAGS) -o [email protected] rlversion.o $(READLINE_LIB) $(TERMCAP_LIB) 
    
    clean mostlyclean: 
        $(RM) $(OBJECTS) $(OTHEROBJ) 
        $(RM) $(EXECUTABLES) 
    
    rlversion.o: rlversion.c 
    
0

Schließlich dachte ich, den richtigen Weg, um es zu tun, ich habe die --prefix Option der sagen kann ich configure Datei mit denen der Bibliothek setzen/installieren. Das Problem über die Installation war, dass ich andere Verzeichnisse nicht das Recht haben, für den Zugriff als mein $HOME, also kein Problem dies zu tun:

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

Dann in meinem Programm schließe ich die Datei von $HOME/libreadline/include.

Um das Hauptprogramm zu kompilieren, verknüpfe ich das Programm mit den Archivbibliotheken $HOME/libreadline/lib/libreadline.a und $HOME/libreadline/lib/libhistory.a.

Da readline files Anweisungen wie #include <readline/readline.h> verwendet, die nicht dem Speicherort der Dateien entsprechen, muss ich dem Compiler mitteilen, wo nach den enthaltenen Dateien gesucht werden soll. Um dies zu tun, setze ich vor der Ausführung von gcc die Variable C_INCLUDE_PATH auf $HOME/libreadline/include.

Schließlich, da readline die dynamische Bibliothek ncurses verwendet, muss ich dem Compiler mitteilen, dass er dynamisch mit meinem Programm verknüpft werden soll. Es könnte der Fall von termcap sein ...

Der Gesamtprozess wie folgt aussieht:

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 

Ich war verwirrt darüber, was tun make install, kopieren Sie nur Dateien auf den Standort der configure vorgesehen, Standardmäßig wird es in Systemverzeichnissen wie /usr/include usw. installiert.aber mit der --prefix Option make install kopiert alle Dateien im angegebenen Verzeichnis.

Die Installation kopiert nur kompilierte Programme, Bibliotheken, Dokumente usw. an einen bestimmten Speicherort, standardmäßig Standard-Systemverzeichnisse, wenn Sie keinen Zugriff auf diese Verzeichnisse wie ich haben, können Sie es in Ihrem eigenen Verzeichnis installieren und dann tu, was immer du willst.

ich die dynamische Bibliothek stattdessen die statische, installiert haben könnte, aber dann würde ich die LD_LIBRARY_PATH Umgebung ändern müssen.