Мотивация
У меня есть 2 статические библиотеки, libStatic1.a и libStatic2.a .Кроме того, у меня есть много SO (Shared Objects), которые компилируются с libStatic1.a.До сих пор libStatic1.a и libStatic2.a были независимыми, и все было в порядке.Но теперь я добавил к коду, который генерирует зависимость libStatic1.aa от кода, который генерирует libStatic2.a.Поэтому любой SO, который зависит от libStatic1.a, теперь должен быть скомпилирован с libStatic2.a.Это нежелательно, потому что он добавляет зависимость от libStatic2.a к каждой цели сборки, которая зависит от libStatic1.a.
только от libStatic1.a теперь необходимо компилировать их код с libStatic2.a для компиляции/ Runtime для успеха / не сбой.Это создает ненужную связь, и я бы хотел ее избежать.
Поэтому мне нужно как-то «встроить» объектный код libStatic2.a в libStatic1.a.Если бы я просто скомпилировал libStatic1.a со всеми объектными файлами libStatic2.a (в дополнение к его собственным), он в основном будет содержать его, но это создает другую проблему - если какой-то пользователь libStatic1.a решит использовать libStatic2.aи свяжет его, он получит странную ошибку «множественные определения».Если бы я мог как-то сказать компилятору генерировать объектные файлы libStatic2.a со слабыми символами (только для использования в libStatic1.a), это решило бы проблему - никто не получит несколько определений и ни один make-файл из всех многих SO.которые используют libStatic1.a, нужно будет изменить.
Мое мышление: я знаю, что возможно (используя GCC / g ++ расширения для языка C ), чтобы объявитьфункция с ключевым словом __ атрибут __ и атрибут слабый следующим образом: void __attribute__((weak)) foo(int j);
Есть ли способ сообщить компилятору (g ++) чтобы скомпилировать весь модуль компиляции как «слабый», то есть все его глобальные символы в таблице символов будут считаться слабыми при компоновке?
В качестве альтернативы, есть ли способ сообщить компоновщику (ld) считать все символами какого-либо объектного файла / библиотеки как слабые?