簡體   English   中英

在我的makefile中設置我的LD_LIBRARY_PATH時遇到麻煩

[英]trouble with setting my LD_LIBRARY_PATH inside my makefile

我試圖將我的LD_LIBRARY_PATH設置在我的makefile中,以便在執行“全部制作”后不必運行命令來對其進行設置。 但是,盡管執行了命令,但是當我嘗試使用./driver時,卻得到了

./driver:加載共享庫時出錯:libparser.so:無法打開共享庫文件:無此類文件或目錄。

當我收到該錯誤(在makefile之外)后執行命令時,它已修復。 您對我做錯了什么有想法嗎? 這是我的Makefile當前:

# OPTIONAL: Set these variables as required.
CFLAGS := -g -Wall -std=c99
LDFLAGS :=
LDLIBS :=

all: static-driver driver setenvp

# OPTIONAL: COMPLETE THIS TARGET
# This target produces an object file for making libraries.
parser.o: parser.c
    cc -c -fPIC $(CFLAGS) parser.c

# COMPLETE THIS TARGET
# This target produces the dynamic library.
lib/libparser.so: parser.o
    gcc -shared -o libparser.so parser.o

# COMPLETE THIS TARGET
# This target produces the executable using the dynamic library
driver: driver.c lib/libparser.so
    gcc driver.c -I$(PWD) -L$(PWD)/lib -o driver -lparser

# This target produces the executable using static library
static-driver: driver.c lib/test.a
    $(CC) $(CFLAGS) driver.c -I$(PWD) lib/test.a -o static-driver

setenvp:
    export LD_LIBRARY_PATH=$(PWD)/lib

.PHONY: clean
clean:
    rm -fv static-driver driver
    rm -fv lib/libparser.so
    rm -fv *.o *.txt *.bin
    rm -fv *~ \#*\# *.swp

由於每一行都是在新的Shell環境中執行的,因此必須在命令之前添加要繼承的任何內容的前綴。 那就是你可能想定義

MY_CC := export LD_LIBRARY_PATH=$(PWD)/lib; gcc

然后由您建立目標

target.o: target.c
    $(MY_CC) ...

首先,您正在使用make變量PWD但從未設置過。 設置此方法的唯一方法是,如果您的shell設置了它並在調用make之前將其導出,則依靠它是不明智的做法。 如果您確實要引用當前目錄,為什么不直接使用. 而不是$(PWD) 更可靠。

其次,在UNIX中,環境變量是當前進程的屬性。 當您在給定的流程中更改環境變量時,所做的更改將傳遞給該流程所創建的任何新子代。

但是,子進程實際上不可能更改其父級的環境。

每個make配方都在新的子進程(shell進程)中運行。

因此,您的目標在這里:

setenvp:
        export LD_LIBRARY_PATH=./lib

實際上將運行/bin/sh -c 'export LD_LIBRARY_PATH=./lib' ,這將啟動一個Shell,在其環境中將子Shell設置為LD_LIBRARY_PATH ,然后退出該子Shell,從而環境更改消失了。 因此,這是一項禁忌措施:它只是花時間而沒有任何效果。

實際上,無法進行make更改調用它的shell的環境,因為make是shell的子進程,因此make無法更改shell的環境。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM