Теперь я создаю динамическую библиотеку C++ libabc.so
и test
приложения на основе этой библиотеки в Linux. libabc.so
вызовет динамическую библиотеку libboost.so
. Я могу скомпилировать libabc.so
очень хорошо, и ошибок не обнаружено. Если я использую команду ldd
на libabc.so
, я могу легко заметить, что эта библиотека имеет зависимость от libboost.so
. Однако, когда я компилирую test
прикладной программы, у меня есть следующая ошибка ссылки:
abc.so: undefined reference to 'boost::filesystem::detail::copy_file(boost::filesystem::path const&, boost::filesystem::path const&, boost::filesystem::copy_option, boost::system::error_code*)'
collect2: ld returned 1 exit status
Я не знаю, откуда эта проблема. Когда я скомпилирую test
программу, я уверен, что libabc.so
ее с libabc.so
и libboost.so
. Я также изменил последовательность libabc.so
и libboost.so
при связывании, чтобы убедиться, что задана правильная последовательность библиотек. Есть идеи? Благодарю.
Функция, о которой идет речь, определяется для принятия разных аргументов, в зависимости от того, скомпилирована ли программа как С++ 03 или С++ 11.
void boost::filesystem::detail::copy_file(boost::filesystem::path const&, boost::filesystem::path const&, boost::filesystem::copy_option::enum_type, boost::system::error_code*) // pre-C++11
void boost::filesystem::detail::copy_file(boost::filesystem::path const&, boost::filesystem::path const&, boost::filesystem::copy_option, boost::system::error_code*) // C++11
По-моему, это ошибка Boost.
Следовательно, если эта функция используется в программе, то как Boost, так и программа должны быть скомпилированы с поддержкой С++ 11 или без них. В противном случае программа будет терпеть неудачу на этапе компоновки.
Обычно для общих библиотек в Linux допускаются неразрешенные ссылки, это не приводит к сбою их связи.
boost_system
, то есть-lboost_system
.boost.so
? Это не обычное имя библиотеки Linux (без префикса "lib") и не обычное имя библиотеки boost (boost обычно поставляется в виде множества небольших общих библиотек, а не одной большой библиотеки). Это не незаконно, но необычно. В моей системе эта функция находится вlibbost_filesystem.so
(иlibbost_filesystem-mt.so
).