Установка пути к разделяемой библиотеке внутри 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 ...
Другие вопросы по тегам