Единственное реальное использование опции компоновщика --whole-archive
, которую я видел, заключается в создании разделяемых библиотек из статических. Недавно я наткнулся на Makefile (ы), которые всегда используют этот параметр при связывании с внутренними статическими библиотеками. Это, конечно, заставляет исполняемые файлы излишне тянуть за код объекта без ссылок. Моя реакция на это заключалась в том, что это просто неправильно, я что-то упустил?Вопрос ld linker: опция -whole-archive
Второй вопрос, который у меня есть, связан с чем-то, что я прочитал относительно опции «весь архив», но не смог разобрать. Что-то в том, что опция --whole-archive
должна использоваться при связывании со статической библиотекой, если исполняемый файл также связывается с общей библиотекой, которая, в свою очередь, имеет (частично) тот же объектный код, что и статическая библиотека. Это общая библиотека, а статическая библиотека перекрывается с точки зрения объектного кода. Использование этой опции приведет к тому, что все символы (независимо от использования) будут разрешены в исполняемом файле. Это должно избегать дублирования объектного кода. Это сбивает с толку, если символ реферируется в программе, он должен быть однозначно разрешен во время соединения, что это за дело о дублировании? (Простите, если этот пункт не совсем воплощение ясности)
Благодаря
Russion Если libhttp.a может быть построено, то это доказывает, что функция register_handler существует в этом libhttp.a. Итак, как эта функция может ссылаться на register_handler в main.cc? Поэтому в этом случае мы должны использовать другой способ реализации вашей идеи. – longbkit