Возможны ли зависимости вложенной статической библиотеки?

12

Я работаю в QT.

  1. Может ли статическая библиотека зависеть от другой статической библиотеки? (Static Lib создается путем связывания другой статической библиотеки)
  2. Если да, возможно ли, что после ссылки на lib2 сгенерированная lib (lib1) не будет содержать все коды lib2?

В моем проекте Qt я использую статическую библиотеку, которая зависит от нескольких библиотек. Мне пришлось добавить все библиотеки (со всеми их заголовками в моем проекте), хотя мне нужен только один lib (и один .h этого класса) в моем коде.

Пожалуйста, объясните сценарий.

Sk Patra
источник

Ответы:

6

Когда вы заявляете что-то, вы просто обещаете, что во время ссылки оно будет доступно и однозначно идентифицировано. Статические библиотеки - не более чем контейнеры для определений в формате, который находится за пределами стандарта. Итак, это имеет следующие последствия:

1) Я не совсем понимаю, о чем вы здесь спрашиваете, но одна статическая библиотека может очень сильно зависеть от другой статической библиотеки. Либо вы обещаете, что определения этой библиотеки будут доступны на последнем этапе компоновки вашего исполняемого файла (предоставляя его в качестве зависимости ссылки). Или вы «сливаете» его во время связывания статической библиотеки.

2) Тогда ответом будет то, что единственное, что вам нужно сделать, это просто не ссылаться в lib2 во время линковки lib1.

В целом, мой лучший подход - объединять библиотеки, которые являются частными, потому что в противном случае клиенты будут сталкиваться с множественными нарушениями символов, когда другие части их проекта делятся с вами зависимостями.

Ylisar
источник
Это означает, что статическая библиотека, которая зависит от другой статической библиотеки, но содержит информацию о связывании этой библиотеки, является ВОЗМОЖНОЙ. Это означает, что когда мне нужно включить первую библиотеку в мой проект, я также обязательно включу вторую. Bcoz, первая библиотека не содержит целых кодов второй библиотеки. Я прав?
Sk Patra
6

Мои быстрые два бита на этом: 10 (извините, ужасная шутка).

Чтобы немного расширить, здесь идет:

1- Статическая библиотека может зависеть от другой статической библиотеки, ничего или даже от динамической библиотеки: в первых двух случаях весь код новой статической библиотеки будет включен в новую SLL (Static Link Library), однако третий вариант в зависимости от окружающей среды может привести к тому, что у SLL будет один из следующих результатов,

  • он будет содержать статические версии кода, требуемого для него, собранные из DLL (Dynamic Link Library)
  • или, что еще более ужасно, у вас была бы статическая библиотека, которая при включении в проект вызвала бы необходимость доставки с DLL, что нарушило бы весь смысл статического связывания.

Короче говоря, вы можете связать статическую библиотеку со статической библиотекой

2 - если lib1 и lib2 оба статичны, а lib1 была связана с lib2, то все функции lib2 были бы доступны в lib1 без необходимости включать lib2, так как lib2 была бы статически связана внутри lib1 (думаю, русские куклы, с lib2 будучи меньше).

В сценарии, который вы описываете, должны быть отдельные функциональные возможности, доступные в каждом из файлов, которые вы должны включить, которые не являются статически связанными, следовательно, необходимо несколько файлов, в противном случае вам нужно было бы включить один файл, и все будет в порядке.

Возьмем следующее: Один файл .h со ссылками на 6 статически связанных библиотек: вам нужно включить 7 файлов в ваш проект, чтобы получить полную функциональность

Пример включения 1

Один SLL, созданный из указанного файла .h, потребует включения только нового SLL для компоновки при компиляции:

Пример включения 2

Надеюсь, это поможет, и я понял, о чем вы спрашивали.

GMasucci
источник