Связывание библиотеки (boost_thread) с непоследовательным наименованием - PullRequest
0 голосов
/ 30 августа 2018

Я создаю Makefile, у которого есть цель, которая связывается с boost_thread. Есть небольшая проблема в том, что boost_thread имеет две идентичные вершины : boost_thread и boost_thread-mt. Пакет поддержки Fedora предоставляет только boost_thread, программные ссылки Ubuntu boost_thread до boost_thread-mt, а Homebrew на macOS предоставляет только boost_thread-mt (если вы не устанавливаете с другими флагами).

Это несоответствие вызывает сожаление. И в идеале, я бы хотел, чтобы мой Makefile мог это согласовать, не прибегая к ручному вмешательству (требуется, чтобы пользователь мягко связывал одно с другим - что может быть невозможно без рута, если вы не хотите много делать искажения). Я имел в виду что-то вроде это :

LIBBOOST_THREAD:=$(shell ldconfig -p | grep libboost_thread | awk '{print $1}' | cut -d. -f1)

target: $(OBJECTS)
    $(CXX) $^ -o $@ $(LDFLAGS) -l$(LIBBOOST_THREAD)

Но этот подход критически не обрабатывает никаких дополнительных настроек в LDFLAGS (если предоставлено -L, ldconfig не будет знать, чтобы искать его). Кажется, что требование разбирать флаги gcc очень хрупко и делает все это громоздким.

Мой лучший удар:

LIBBOOST_THREAD:=$(shell echo $(LDFLAGS) | xargs printf -- '%s\n' | grep '^-L' | cut -b 3- | xargs ldconfig -p | grep libboost_thread | awk '{print $1}' | cut -d. -f1)

Это неприглядно и, вероятно, не корректно обрабатывает некоторые кавычки или новые строки в LDFLAGS.

Есть ли какой-нибудь разумный способ автоматизировать это без такой хрупкости? Возможно, можно попросить у gcc этот список (или условно выбрать правильную библиотеку)?

...