Установка пути к разделяемой библиотеке внутри make-файла для компиляции
Я хочу скомпилировать программу, используя make-файл, связанный с общими библиотеками 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: команда не найдена
Где я не прав?
1 ответ
Где я не прав?
Вы не правы в том, что вы изменили свой 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 ...