Боюсь, для этого вам нужно будет изменить привязку.
Вы должны понимать, что объекты в архиве (.a
), которые могут быть связаны или не связаны с вашим исполняемым файлом, являются не определениями отдельных символов, а отдельными членами архива, которые являются объектными файлами < / em>, каждый из которых может определять произвольное количество символов. Если вы хотите связать символ из архива, вы связываете весь элемент архива, который его определяет. 1
Основное различие между связыванием архива (.a
) с исполняемым файлом и связыванием объектного файла (.o
) заключается в том, что объектный файл будет связан безоговорочно, тогда как член архива будет связан только в том случае, если он предоставляет определение по крайней мере для одного символа, на который была сделана ссылка, но который не был определен при проверке архива.
Следовательно, обычный, не обходной способ гарантировать, что символ foo
безоговорочно связан, - это связать файл объекта, который его определяет. Невозможно пометить члена архива foo.o
как должен быть связан, потому что, если вы должны связать foo.o
, вы делаете это путем связывания foo.o
.
Итак, если foo
находится в члене архива foo.o
, вы можете извлечь этот член из архива:
ar x libthing.a foo.o
и добавьте foo.o
в вашу связь, даже если у вас нет foo
источника для компиляции foo.o
.
Если есть много функций, которые вы хотите безоговорочно связать, вы можете либо скомпилировать их все из источника в один объектный файл, если у вас есть источник, либо собрать все объектные файлы, которые определяют их, в один архив, который вы связываете с --whole-archive
.
Я надеялся найти способ рекламировать публичный характер символа в самой библиотеке.
Для целей связывания в библиотеке нет ничего, кроме общедоступных символов: по определению любые символы, которые может видеть компоновщик, являются общедоступными.
[1] Если вы в состоянии скомпилировать объектный файл, который входит в вашу компоновку, то с помощью соответствующих флагов компилятора и компоновщика вы можете гарантировать, что избыточные символы, которые он может внести, будут окончательно отброшены компоновщиком. См.
этот ответ
person
Mike Kinghan
schedule
09.02.2016