[英]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.