Makefile make install 不執行多行指令

Makefile make install 不執行多行指令

我有一個 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/libsLDIR然後編譯應該可以幫助您開始。


參考

緬因州科爾比學院計算機科學系 - Makefile 教程
M4 巨集處理器 - 貼上替換

相關內容