Циркулярни свързващи библиотеки

Имаме приложение, в което кодът е организиран в няколко библиотеки, някои от които зависят от друга от тези библиотеки, така че имаме дърво на зависимости като

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