Makefile make install 不执行多行命令

Makefile make install 不执行多行命令

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


参考

缅因州科尔比学院计算机科学系 - Makefile 教程
M4 宏处理器 - 粘贴替换

相关内容