在 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 ...
我想使用链接到 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 ...