Циклические библиотеки ссылок

У нас есть приложение, в котором код организован в несколько библиотек, некоторые из которых зависят от других из этих библиотек, поэтому у нас есть дерево зависимостей, например

App
 |
 +--------+--------+
 |        |        |
 v        v        v
lib1     lib2     lib3
 |        |
 v        v
lib3     lib3

Недавно кто-то добавил в lib3 новый метод, который зависит от класса, определенного в lib2, и, поскольку он генерировал циклические включения, мы сделали предварительное объявление класса, необходимого в заголовочном файле, присутствующем в lib3.

Теперь каждая библиотека скомпилирована в статическую библиотеку, а затем связана с соответствующим списком ссылок, поэтому lib2 находится в списке ссылок lib2, а также lib3 находится в списке симпатий lib2.

Пока это работает отлично, но мне было интересно узнать о недостатках, связанных с такой компиляцией и связыванием зависимостей. Я думал, что может случиться так, что изменение в lib2 не будет замечено lib3, если оно не будет перекомпилировано, но я проверил, и любое изменение в любом заголовочном файле в lib2 вызовет перекомпиляцию lib3 (здесь немного удачи).

Есть ли какой-либо другой важный недостаток, о котором я должен знать??


person Rodrigo    schedule 30.05.2016    source источник
comment
...любое изменение в любом заголовочном файле в lib2 вызовет перекомпиляцию lib3. Почему? Это то, что вы навязали в системе сборки, или это возникло естественным образом из-за шаблона операторов #include? А если второе, то уверены ли вы, что все эти #include утверждения действительно необходимы?   -  person Beta    schedule 30.05.2016
comment
Один метод, который я использовал в этом случае, состоит в том, чтобы определить базовый класс с чистой виртуальной функцией в одной библиотеке. Выведите из него в другой библиотеке. Тогда вы уменьшите зависимость. Может быть, есть другие методы. Я думаю, вам следует избегать круговой зависимости.   -  person user2672165    schedule 30.05.2016
comment
С циклической зависимостью вам всегда нужно связываться со всеми библиотеками. Тогда вы могли бы также создать один большой файл статической библиотеки.   -  person user2672165    schedule 30.05.2016
comment
@Beta это не навязанное условие, это больше похоже на счастливое состояние, но мы хотели бы убрать удачу из панорамы.   -  person Rodrigo    schedule 31.05.2016


Ответы (1)


Есть ли какой-либо другой важный недостаток, о котором я должен знать??

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

Чтобы избавиться от порядка, который компоновщик использует для разрешения этих зависимостей, обычно предоставляется возможность сгруппировать их, как если бы они просто использовали один пул файлов .obj/.o.

Для компилятора GCC эти параметры следующие: -Wl,--start-group ,-Wl,--end-group.

person πάντα ῥεῖ    schedule 30.05.2016