我想用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 ...