Рассмотрим следующую структуру кода:
main.cpp -> depends on libone.a -> depends on libtwo.a
Предположим, что в main.cpp
используются только функции из libone.a
.Так что реально программист, пишущий main.cpp
, действительно заботится только о libone.a
.На данный момент они даже не знают, что libone.a
зависит от libtwo.a
.
Они пытаются скомпилировать свой код следующим образом и получить ошибки компоновщика:
g++ -o main main.cpp -lone
- Ошибка!Неопределенные символы!
Это становится проблемой, поскольку, поскольку libone.a
зависит от libtwo.a
, любой, кто использует libone.a
, должен знать об этой зависимости ... Как вы можете себе представить, эта проблема может возникнуть сНАМНОГО больше зависимостей, чем одна библиотека, и может быстро стать связующим кошмаром.
Попытка 1 при решении этой проблемы:
Первой мыслью, решившей эту проблему, было: «Это просто,я просто свяжу libone.a
с libtwo.a
при компиляции libone.a
!
Оказывается, все не так просто, как я надеялся ... При компиляции libone.a
нет способаlink libtwo.a
. Статические библиотеки не ссылаются ни на что при компиляции, вместо этого все зависимости должны быть связаны при компиляции библиотек в исполняемый файл.
Например, чтобы компилировать main.cpp
, чтозависит от статической библиотеки, которая, в свою очередь, зависит от другой статической библиотеки, вы должны связать обе библиотеки. ВСЕГДА.
g++ -o main main.cpp -lone -ltwo
Попытка 2 при решении этой проблемы:
еще один тОн пытался скомпилировать libone
в виде динамической библиотеки, которая ссылается на libtwo.a
.
Как ни странно, это сработало!После компиляции и компоновки libone.so
основная программа должна заботиться только о libone.so
и больше не должна знать о libtwo.a
.
g++ -o main main.cpp -lone
Success!
После выполнения этого упражнения одна часть все еще отсутствует.Я просто не могу понять причину, по которой статические библиотеки не могут ссылаться в других библиотеках, а динамические могут.На самом деле, динамическая библиотека libone.so
не будет компилироваться, пока я не свяжу libtwo.a
.Это нормально, хотя, как автор libone.so
, я бы знал о его зависимости от libtwo.a
- Автор main.cpp
, однако, не знал бы.И реально им не нужно знать.
Итак, до реального вопроса ... Почему динамические библиотеки могут ссылаться на другие библиотеки, подобные этим, а статические - нет?Кажется, это очевидное преимущество динамических библиотек перед статическими, но я нигде не упоминал об этом!