В основном файле make, который я написал для упрощения сборки приложений / библиотеки, я использовал решение дважды выполнить шаг ссылки.Использование опции компоновщика -u для указания неопределенных символов на второй ссылке.
В моем файле make у меня есть цель, подобная этой:
undefined.txt:
@$(generate-undefined-syms)
, которая вызывает этот макрос ... первыйпопытка связать ...
define generate-undefined-syms
$(PRINTF) "$(this_makefile): Generating undefined symbols ... \n"
$(CC) -o rubbish $(LDFLAGS) $(objects) $(LDLIBS) 2>&1 | $(GREP) 'undefined reference' > tmp.txt; \
$(SED) 's/^.*`/-Wl,-u/g' < tmp.txt > undefined.txt; \
rm -f tmp.txt rubbish
endef
Поскольку мои навыки sed / regexp не очень хороши (и я написал этот материал в спешке), я получаю undefined.txt, содержащий:
-uSomeSym'
-uSomeOtherSym'
то есть с завершающим '
Затем я использую этот синтаксис make для удаления' s 'и удаления дубликатов
undefined_references = $(filter-out follow, $(sort $(subst ',,$(shell cat undefined.txt))))
Фильтр follow следует, потому что если неопределенный символссылаясь много раз, в выходных данных появляется сообщение «больше ссылок на XXX follow», что приводит к ложному «follow» в файле undefined.txt, например,
-Wl, uXXXX' follow
Наконец я связываюсь во второй раз (примечаниезависимость от undefined.txt)
$(application): $(library_dependencies) $(objects) undefined.txt
$(CC) -o $@ $(LDFLAGS) $(undefined_references) $(objects) $(LDLIBS)
Кстати, я бы полностью порекомендовал следующую книгу, так как через пару дней смог написать простую систему сборки.
Управление проектами с помощью GNU Make, третье издание Автор: Роберт Мекленбург