2

我想使用与 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: line 1: @ar: command not found

我哪里错了?

4

1 回答 1

3

我哪里错了?

你错了,因为你Makefile错误地修改了你的。

您有一个宏Q,它的计算结果为,如果是命令行的第一个字符@,它会使make安静(不打印它执行的命令) 。通过在命令行前面,你搞砸了: @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您所做的设置只会影响库的构建(即编译器和链接器)。您想要的是影响使用这些库的运行时,而不是用于构建它们的编译器和链接器。

正如 DevSolar 正确指出的那样,您想要-rpath

$(Q)$(CC) $(SOFLAGS) -o $@ $(MINIZIP_DIR)/ioapi.so \
  -Wl,-rpath=$(ZLIBDIR) $(MINIZIP_DIR)/zip.so ...
于 2015-08-26T04:26:13.033 回答