在我的makefile中设置LD_LIBRARY_PATH会出现问题

时间:2017-11-01 20:06:58

标签: c makefile

我正在尝试在我的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

2 个答案:

答案 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环境。