Почему я получаю ошибку "DSO missing", даже если компоновщик может найти библиотеку?

Я компилирую программу против общей библиотеки, которую я написал. Эта библиотека в свою очередь полагается на Boost::program_options (среди других библиотек). Когда я компилирую свою программу, мне нужно, конечно, упомянуть мою библиотеку, но я получаю ошибку DSO:

g++ ism_create_conf.cc -o ism_create_conf -lglsim_ol -lglsim -lhdf5 -lgsl

/usr/bin/ld.real: /tmp/cc9mBWmM.o: undefined reference to symbol_ZN5boost15program_options8validateERNS_3anyERKSt6vectorISsSaISsEEPSsi'
//usr/lib/x86_64-linux-gnu/libboost_program_options.so.1.55.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

Я знаю, что ошибка уходит, если я добавлю -lboost_program_options. То, что я не понимаю,

  • Почему я должен это делать, даже если моя программа не вызывает Boost напрямую (только через мою библиотеку glsim).

  • Почему линкер хочет -lboost_program_options, когда он фактически нашел правильную библиотеку (и местоположение) сам по себе (см. вторую строку сообщения об ошибке).

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

Ответ 1

Современные дистрибутивы (например, Ubuntu Natty и позже) включить - -s-needed по умолчанию в своих инструментальных цепочках. Одним из побочных эффектов является то, что компоновщик упорядочивает порядок библиотек более строго (не уверен, почему это было сделано, вероятно, чтобы соответствовать случаю статических библиотек).