Допустим, я хочу создать динамическую библиотеку dynamic.so
, но мой код ссылается на функцию, которая существует в какой-то другой статической библиотеке static.a
. Естественно, если я скомпилирую и свяжу с g++
и -shared
option, dynamic.so
будет ожидать, что указанная функция будет реализована в какой-то другой динамической библиотеке, которую мне придется связать во время выполнения вместе с dynamic.so
. Другими словами, он будет счастлив, пока я буду использовать -l static
(синтаксис по модулю).
Но поскольку эта другая библиотека на самом деле статическая, я не могу этого сделать. Предположим, я также не могу связать статическую библиотеку во время компиляции моей основной программы, но я вынужден использовать только динамические библиотеки. Итак, что я действительно хочу, так это включить скомпилированный код из функции, на которую имеется ссылка, из static.a
в dynamic.so
.
В этом ответе на связанный вопрос предлагается использовать параметр --whole-archive
для включения static.a
в dynamic.so
. Однако в моем случае static.a
огромен. И мне действительно не нужно все это, мне нужно только одно определение функции.
Этот ответ на другой вопрос объясняет, что связывание со статической библиотекой во время компиляции означает, что включается только тот код, на который фактически имеется ссылка. в двоичном формате. Что ж, это именно то, что я хотел бы сделать для моей единственной ссылки на функцию! Я действительно не хочу, чтобы там был весь статический архив.
Но как я могу этого добиться? Как я могу включить только необходимые части static.a
в dynamic.so
?
-l
себя в вопросе: еще раз меня укусил тот факт, что порядок аргументов в gcc имеет значение ... Спасибо! 07.12.2011