Установка пути к разделяемой библиотеке внутри make-файла для компиляции

Я хочу скомпилировать программу, используя 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: команда не найдена

Где я не прав?


person famedoro    schedule 25.08.2015    source источник
comment
Существует возможность, чтобы компоновщик жестко закодировал путь к библиотечной зависимости в библиотеке или исполняемом файле, -Wl,-rpath. Это может быть именно то, что вы ищете. (Оставляет LD_LIBRARY_PATH свободным для того, для чего он должен — только — использоваться, то есть для отладки.)   -  person DevSolar    schedule 25.08.2015
comment
При этом я думаю, что ваша проблема (@ar: command not found) возникает из-за несколько необычного использования $(Q), которое, я полагаю, вы установили в "@", чтобы успокоить ваш make-файл. Обратите внимание, что make -s (--silent) делает то же самое.   -  person DevSolar    schedule 25.08.2015
comment
@ DevSolar, спасибо, я удалил $(Q) и работает. Я также добавил CFLAGS= -O3 -I/usr/work/libxlsxwriter-master/zlib-1.2.8   -  person famedoro    schedule 25.08.2015


Ответы (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 ...
person Employed Russian    schedule 26.08.2015
comment
То, что он говорит. Вчера у меня раскалывалась голова, и я не удосужился выразить это так много слов. ;-) - person DevSolar; 26.08.2015