在 makefile 中设置共享库的路径以进行编译

Setting path to shared library inside a makefile for compile

我想使用链接到 zlib 共享库的 makefile 编译一个程序,它与我系统上安装的不同。但我不希望它们永久添加到我系统的图书馆池中。

自定义zlib路径为/usr/work/libxlsxwriter-master/zlib-1.2.8

我试过使用类似的东西:

ZLIBDIR=/usr/work/libxlsxwriter-master/zlib-1.2.8

# The static library.
$(LIBXLSXWRITER_A) : $(OBJS)
    export LD_LIBRARY_PATH=$(ZLIBDIR):$(DEPENDENCIES); \
    $(Q)$(AR) $(ARFLAGS)     $@ $(MINIZIP_DIR)/ioapi.o $(MINIZIP_DIR)/zip.o  $^

 # The dynamic library.
 $(LIBXLSXWRITER_SO) : $(SOBJS)
    export LD_LIBRARY_PATH=$(ZLIBDIR):$(DEPENDENCIES); \
    $(Q)$(CC) $(SOFLAGS)  -o $@ $(MINIZIP_DIR)/ioapi.so $(MINIZIP_DIR)/zip.so $^ -lz

# Targets for the object files.
%.o  : %.c $(HDRS)
    $(Q)$(CC)       -I$(INC_DIR) $(CFLAGS) $(CXXFLAGS) -c $<

 %.so : %.c $(HDRS)
    $(Q)$(CC) -fPIC -I$(INC_DIR) $(CFLAGS) $(CXXFLAGS) -c $< -o $@

  %.to : %.c $(HDRS)
    $(Q)$(CC) -g -O0 -DTESTING -I$(INC_DIR) $(CFLAGS) $(CXXFLAGS) -c $< -o $@

当我尝试编译时,出现此错误:/bin/sh:第 1 行:@ar:找不到命令

我哪里错了?

Where I'm wrong ?

你错了,你的 Makefile 修改不正确。

你有一个宏 Q,计算结果为 @,这使得 make 安静(不打印它执行的命令)if @ 是命令行的第一个字符。通过在命令行前添加 LD_LIBRARY_PATH,你搞砸了:

# this is a quiet command:
@ar ...

# this is a not quiet command, which tries to execute @ar, which doesn't exist:
LD_LIBRARY_PATH=... ; @ar ...

错误的第二部分是设置 LD_LIBRARY_PATH 只影响库(即编译器和链接器)的 building。您想要的是影响使用这些库的运行时而不是用于构建它们的编译器和链接器。

正如 DevSolar 正确指出的那样,您需要 -rpath 而不是:

$(Q)$(CC) $(SOFLAGS) -o $@ $(MINIZIP_DIR)/ioapi.so \
  -Wl,-rpath=$(ZLIBDIR) $(MINIZIP_DIR)/zip.so ...