Почему в прикладной программе будет ошибка неизвестной ссылки на C ++, а не библиотека в linux

0

Теперь я создаю динамическую библиотеку 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 при связывании, чтобы убедиться, что задана правильная последовательность библиотек. Есть идеи? Благодарю.

  • 2
    Я думаю, что вам также нужна boost_system , то есть -lboost_system .
  • 1
    Что такое boost.so ? Это не обычное имя библиотеки Linux (без префикса "lib") и не обычное имя библиотеки boost (boost обычно поставляется в виде множества небольших общих библиотек, а не одной большой библиотеки). Это не незаконно, но необычно. В моей системе эта функция находится в libbost_filesystem.solibbost_filesystem-mt.so ).
Показать ещё 9 комментариев
Теги:

1 ответ

2
Лучший ответ

Функция, о которой идет речь, определяется для принятия разных аргументов, в зависимости от того, скомпилирована ли программа как С++ 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 допускаются неразрешенные ссылки, это не приводит к сбою их связи.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню