我有一个 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/libs
到LDIR
然后编译应该可以帮助您开始。