我想使用makefile编译一个程序,该程序与zlib共享库链接,该库与系统上安装的库不同。但是我不希望将它们永久添加到系统的库池中。
定制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:找不到命令
我哪里错了?
我哪里错了?
您错误地修改了您的内容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 ...
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句