在makefile中设置共享库的path进行编译

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

自定义zlib的path是/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:命令未find

我哪里错了?

我哪里错了?

你错了,因为你错误地修改了你的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 -rpath:

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