#gcc #ld #pkg-config
Вопрос:
Я пытаюсь использовать библиотеку libfoo.so
, которая будет установлена в $(LIBDIR)/foo/
where $(LIBDIR)
, переменная среды, которая может отличаться в зависимости от настройки сборки.
Для того, чтобы другие компоненты правильно связывались с этой библиотекой, они должны иметь правильный набор LDFLAGS, а именно, они должны иметь -L$(LIBDIR)/foo -lfoo
набор. Чтобы сделать это немного более общим, я хотел бы добавить файл libfoo.pc в libfoo с установленными этими флагами. В настоящее время мой файл содержит следующее содержимое:
Name: libfoo Description: Example library Version: 1.0.0 Libs: -L$(LIBDIR)/foo -lfoo
Мой другой компонент, который использует libfoo, имеет следующий упрощенный файл makefile:
all: $(CC) bar.c -o out $(shell pkg-config --libs libfoo)
Библиотека правильно найдена pkg-config, но при запуске make
появляется следующая ошибка:
$ make cc bar.c -o out -L$(LIBDIR)/foo -lfoo /bin/sh: LIBDIR: command not found
Другими словами, $(LIBDIR)
не расширяется до значения, заданного в качестве переменной среды. Можно ли использовать переменные среды или переменные makefile в файлах .pc?
Комментарии:
1. Вы пробовали
$LIBDIR
без скобок?2. Да , без скобок это приводит к
cc bar.c -o out -L$LIBDIR/foo -lfoo
тому, что больше не выдает ошибку «команда не найдена», но это также не помогает при связывании3. Какую еще ошибку вы тогда получите?
4.Затем я получаю следующую ошибку компоновщика:
cc bar.c -o out -L$LIBDIR/foo -lfoo
/usr/bin/ld: cannot find -lfoo
collect2: error: ld returned 1 exit status
make: *** [Makefile:8: all] Error 1
как и ожидалось, потому что библиотека не может быть найдена
Ответ №1:
Похоже, что использование переменных среды внутри pkg-config.pc
файлов невозможно.
В качестве обходного пути я вместо этого добавлю переменную префикса в файл .pc, который заполняется или перезаписывается сценарием до компиляции моего bar
компонента.