Как мне построить статическую библиотеку, которая по выбору использует другие статические библиотеки? - PullRequest
1 голос
/ 09 ноября 2010

Можно ли построить статическую библиотеку, называемую, скажем, libA, которая:

  1. Содержит код, который вызывает классы из libB (не создан мной, поэтому я не могу изменить или получить к нему доступ);
  2. Компилируется, когда помещается в приложение, которое не связывается с libB (естественно, оно завершится сбоем, если код, использующий классы libB, вызывается без libB, но я могу обойти это. Мне просто нужно приложение, которое связывается с libA но не libB для компиляции.)?

Ответы [ 2 ]

1 голос
/ 09 ноября 2010

Краткий ответ, нет.

Статические ссылки должны быть разрешены во время соединения - вот что означает статическое связывание.

Что вы можете сделать, это создать динамическую библиотеку, которая статически связывает libB, а затем динамически связать его с вашим приложением.Если вы предпочитаете статическое связывание, вы можете создать статическую библиотеку, которая выполняет динамическое связывание с вашей динамически связанной библиотекой.

0 голосов
/ 09 ноября 2010

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

Вы можете включить в свою библиотеку неопределенный слабый символ для каждого символа libB, на который вы ссылаетесь.Если ваш код не связан с libB на последнем этапе компоновки, каждый неопределенный слабый символ будет NULL.В противном случае неопределенные слабые символы будут заменены символами из libB.Если вы используете GCC, вы можете использовать __attribute__((weak)) в объявлениях символов.

...