Извлечение мелких частей большой библиотеки (fx boost) - PullRequest
2 голосов
/ 08 ноября 2010

Я хотел бы знать, существует ли автоматизированный способ извлечения небольшой части большой библиотеки C ++.

Допустим, мне нужно только повысить :: рациональность в каком-то проекте. Однако весь буст 1.42 занимает 279 МиБ!

Чтобы сохранить мой проект "автономным" (например, для некоторых школьных работ), я хотел бы иметь возможность включить boost ::ational в дополнение к своему собственному источнику. (Идея в том, что мой учитель не должен заранее устанавливать тысячи библиотек для компиляции)

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

Я полагаю, что это извлечение может быть легко выполнено путем обхода дерева зависимостей #include корня #include (например, boost /ational.hpp); но был ли сделан такой инструмент? Как его зовут?

1 Ответ

2 голосов
/ 08 ноября 2010

В Linux вы можете использовать флаг "x" для "ar" , чтобы извлечь все объектные файлы из библиотеки.

Вы можете использовать "nm" , чтобы определить, какие символы нужны вашему коду, а какие (библиотечные) объектные файлы определяют их.(Существует необязательный флаг - demangle , который может помочь человеку прочитать вывод.)

Затем вы можете создать новую библиотеку, состоящую только из тех объектных файлов, которые вам нужны.(Через "ar " и "ranlib" .) Или просто скомпилируйте (свяжите) их непосредственно в командной строке.

Это простой вопрос сценариев длянайти символы, отсутствующие в вашем (скомпилированном) объектном коде, а затем определить, какие объектные файлы из библиотеки определяют их.И затем, конечно, какие символы отсутствуют в тех объектных файлах библиотеки, которые требуют других библиотечных файлов ... И те, которые отсутствуют в этих новых файлах библиотеки (объекта) ... И так далее.И так далее.

Все сводится к большой работе (обычно) для слишком малой выгоды.Особенно, когда вы попадаете в такие вещи, как слабые символы, косвенные ссылки и т. Д.

...