![Makefile make install 不執行多行指令](https://rvso.com/image/36035/Makefile%20make%20install%20%E4%B8%8D%E5%9F%B7%E8%A1%8C%E5%A4%9A%E8%A1%8C%E6%8C%87%E4%BB%A4.png)
我有一個 Makefile,其中包含一個install
允許我make install
在建立原始程式碼後進行操作的部分。這install
部分包含兩行 shell 指令:
install: /usr/local/lib
cp $(LIB_OBJ) $<
export LD_LIBRARY_PATH=$<
因此,第一行將 libxxx.so 複製到/usr/local/lib
,第二行將環境變數設為LD_LIBRARY_PATH
,/usr/local/lib
以便最終的執行檔可以找到 libxxx.so 檔案。
但是當我make install
從命令列運行然後鍵入:
echo $LD_LIBRARY_PATH
它顯示空內容而不是/usr/local/lib
預期的內容。那為什麼Makefile中的第二行指令沒有執行呢?
答案1
make
幾乎可以肯定正在執行兩行命令。但是,該行export LD_LIBRARY_PATH=$<
(或任何make
擴展它的內容)由作為該進程的子進程的 shell 執行make
。當您輸入 時echo $LD_LIBRARY_PATH
,您將獲得環境變數 LD_LIBRARY_PATH 中的所有內容。您的 shell 沒有執行“導出”,這是執行它的子進程make
。您必須在您的文件或任何文件中進行匯出.bashrc
,.zshrc
或手動輸入。
答案2
嘗試:
export LD_LIBRARY_PATH := /usr/local/lib:$(LD_LIBRARY_PATH)
install:
#Do Install actions
看Make 手冊第 5.3 節為了解釋 Bruce 對子 shell 的正確假設,我們得到StackOverflow 上的這個答案,它指出所有命令都應作為一個行執行。
更新
由於單行程式碼不起作用,請使用以下內容作為範例(我包含以下文件,以便最終的 makefile 可以工作):
文件列表:
你好馬克.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;
}
你好make.h
/*
example include file
*/
void myPrintHelloMake(void);
結束文件列表
產生檔案
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)/*~
上面的 makefile 使用巨集和字串擴充來正確設定包含和庫目錄,而不需要命令export
。就您而言,傳遞/usr/local/libs
到LDIR
然後編譯應該可以幫助您開始。