![Makefile make install führt keine mehrzeiligen Befehle aus](https://rvso.com/image/36035/Makefile%20make%20install%20f%C3%BChrt%20keine%20mehrzeiligen%20Befehle%20aus.png)
Ich habe ein Makefile, das einen install
Abschnitt enthält, der es mir ermöglicht, make install
nach dem Erstellen des Quellcodes Folgendes zu tun. Der install
Abschnitt enthält zwei Zeilen mit Shell-Befehlen:
install: /usr/local/lib
cp $(LIB_OBJ) $<
export LD_LIBRARY_PATH=$<
Daher kopiert die erste Zeile die libxxx.so nach /usr/local/lib
und die zweite Zeile setzt die Umgebungsvariable auf LD_LIBRARY_PATH
, sodass /usr/local/lib
die endgültige ausführbare Datei die libxxx.so-Datei finden kann.
Aber wenn ich es make install
von der Kommandozeile aus ausführe und dann eingebe:
echo $LD_LIBRARY_PATH
Es wird leerer Inhalt angezeigt, statt /usr/local/lib
wie beabsichtigt. Warum wird also die zweite Befehlszeile im Makefile nicht ausgeführt?
Antwort1
make
führt mit ziemlicher Sicherheit beide Befehlszeilen aus. Die Zeile export LD_LIBRARY_PATH=$<
(oder was auch immer make
sie erweitert) wird jedoch von einer Shell ausgeführt, die ein untergeordneter Prozess des make
Prozesses ist. Wenn Sie eingeben echo $LD_LIBRARY_PATH
, erhalten Sie, was auch immer die Umgebungsvariable LD_LIBRARY_PATH enthielt. Ihre Shell hat den „Export“ nicht ausgeführt, sondern ein Unterprozess von make
. Sie müssen den Export in Ihrer .bashrc
oder .zshrc
einer beliebigen Datei durchführen oder ihn manuell eingeben.
Antwort2
Versuchen:
export LD_LIBRARY_PATH := /usr/local/lib:$(LD_LIBRARY_PATH)
install:
#Do Install actions
SehenAbschnitt 5.3 des Make-Handbuchsfür eine Erklärung von Bruce' korrekter Annahme über Unterschalen, die uns zudiese Antwort bei StackOverflow, das besagt, dass alle Befehle als einzeilige Zeile ausgeführt werden sollen.
Aktualisieren
Da der Einzeiler nicht funktioniert hat, verwenden Sie Folgendes als Beispiel (ich füge die Dateien unten ein, damit das endgültige Makefile funktioniert):
Dateiliste:
hellomacke.c
#include
int main() {
// call a function in another file
myPrintHelloMake();
return(0);
}
hellofunc.c
#include
#include
void myPrintHelloMake(void) {
printf("Hello makefiles!\n");
return;
}
hallomake.h
/*
example include file
*/
void myPrintHelloMake(void);
Ende der Dateiliste
Makefile
IDIR =../include
CC=gcc
CFLAGS=-I$(IDIR)
ODIR=obj
LDIR =../lib
LIBS=-lm
_DEPS = hellomake.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
_OBJ = hellomake.o hellofunc.o
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
$(ODIR)/%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
hellomake: $(OBJ)
gcc -o $@ $^ $(CFLAGS) $(LIBS)
.PHONY: clean
clean:
rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~
Das obige Makefile verwendet Makros und String-Erweiterung, um die Include- und Bibliotheksverzeichnisse ohne den Befehl richtig einzurichten export
. In Ihrem Fall sollten Sie mit der Übergabe /usr/local/libs
an LDIR
und der anschließenden Kompilierung beginnen können.
Verweise
Colby College, Maine, Fakultät für Informatik - Makefile-Tutorial
Der M4-Makroprozessor - Paste-Substitution