我正在尝试在我的makefile中设置我的LD_LIBRARY_PATH,以便在“make all”之后我不必运行命令来设置它。但是,虽然执行了命令,但当我尝试使用./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
答案 0 :(得分:2)
由于每一行都是在新的shell环境中执行的,因此必须这样做 在命令之前添加要继承的任何内容。那是你 可能想要定义
MY_CC := export LD_LIBRARY_PATH=$(PWD)/lib; gcc
然后通过
构建目标target.o: target.c
$(MY_CC) ...
答案 1 :(得分:1)
首先,您使用的是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,然后环境更改消失。所以这是一个无操作:它只是占用时间而没有效果。
实际上没有办法改变调用它的shell的环境,因为make是shell的子进程,因此make不能改变你的shell环境。