Как мне сказать ld игнорировать отсутствующую библиотеку? - PullRequest
2 голосов
/ 23 октября 2011

Я бы хотел определить Makefile с неявными правилами для группы исполняемых файлов, некоторые из которых требуют связывания с пользовательской библиотекой (назовем это libedich.a).

Моя проблема в том, что я хотел бы иметь возможность создавать те исполняемые файлы, которые не требуют libedich.a, когда последний еще не был собран. Если я просто добавлю -ledich к переменной LDLIBS, я получу ошибки, когда libedich.a не существует:

/usr/bin/ld: cannot find -ledich

Как я могу сказать ld, что можно продолжать связывать, когда данной библиотеки не существует?

Ответы [ 2 ]

3 голосов
/ 25 января 2015

Распространенным решением является создание фиктивного архива, чтобы GCC нашел его. Поскольку исполняемый файл не нуждается в каких-либо символах из библиотеки, он не выдаст ошибку. Вот так

# create an empty archive.
ar cru libedich.a

или даже проще,

echo '!<arch>' >libedich.a
0 голосов
/ 06 июля 2012

Это недостаток использования одной переменной LDLIBS для хранения всех библиотечных зависимостей и ее повторного использования для каждой цели, даже если вы знаете, что для некоторых целей требуется только подмножество библиотек.У вас есть несколько вариантов:

  • Вероятно, существуют модные IDE и инструменты сборки, которые пытаются вывести зависимости библиотеки из контекста, избавляя вас от необходимости вручную указывать их для каждой цели.
  • Переключитесь на использование общих библиотек.
  • Исправьте цель в вашем Makefile так, чтобы она зависела от libedich.a (даже если это не нужно).Это сработает, если вы все равно строите и вам все равно, в каком порядке идут цели.
  • Вручную укажите зависимости библиотеки для каждой цели в вашем Makefile.

Последний вариант - моя рекомендация;это больше работы, но устранение ложных зависимостей в вашем Makefile позволит вам построить (возможно, большую часть) ваших целей, даже если одна из зависимостей нарушена.Один из удобных способов сделать это с помощью переменных, специфичных для цели:

targetname::LDLIBS+=-ledich

Возможно, вы также хотите знать о make --keep-going (make -k)

...