Неопределенная ссылка на boost :: system :: generic_category (), хотя библиотеки даны для g ++ - PullRequest
1 голос
/ 26 марта 2019

Какие флаги компоновщика мне здесь не хватает?

Я пытаюсь скомпилировать это на Ubuntu 18.04 LTS, и он не работает, он работает внутри образа докера Debian 9:

#include <boost/dll.hpp>

// Trying to compile it with:
// g++ -o program -lboost_filesystem -ldl -lboost_system program.cpp

int main() {
  boost::dll::program_location();
  return 0;
}

Я получаю ошибку:

/tmp/ccKlWUUd.o: In function `__static_initialization_and_destruction_0(int, int)':
program.cpp:(.text+0x68): undefined reference to `boost::system::generic_category()'
program.cpp:(.text+0x74): undefined reference to `boost::system::generic_category()'
program.cpp:(.text+0x80): undefined reference to `boost::system::system_category()'
/tmp/ccKlWUUd.o: In function `boost::system::error_code::error_code()':
program.cpp:(.text._ZN5boost6system10error_codeC2Ev[_ZN5boost6system10error_codeC5Ev]+0x17): undefined reference to `boost::system::system_category()'
/tmp/ccKlWUUd.o: In function `boost::system::error_category::std_category::equivalent(int, std::error_condition const&) const':
program.cpp:(.text._ZNK5boost6system14error_category12std_category10equivalentEiRKSt15error_condition[_ZNK5boost6system14error_category12std_category10equivalentEiRKSt15error_condition]+0xb8): undefined reference to `boost::system::generic_category()'
program.cpp:(.text._ZNK5boost6system14error_category12std_category10equivalentEiRKSt15error_condition[_ZNK5boost6system14error_category12std_category10equivalentEiRKSt15error_condition]+0xf3): undefined reference to `boost::system::generic_category()'
/tmp/ccKlWUUd.o: In function `boost::system::error_category::std_category::equivalent(std::error_code const&, int) const':
program.cpp:(.text._ZNK5boost6system14error_category12std_category10equivalentERKSt10error_codei[_ZNK5boost6system14error_category12std_category10equivalentERKSt10error_codei]+0xb8): undefined reference to `boost::system::generic_category()'
program.cpp:(.text._ZNK5boost6system14error_category12std_category10equivalentERKSt10error_codei[_ZNK5boost6system14error_category12std_category10equivalentERKSt10error_codei]+0xf3): undefined reference to `boost::system::generic_category()'
program.cpp:(.text._ZNK5boost6system14error_category12std_category10equivalentERKSt10error_codei[_ZNK5boost6system14error_category12std_category10equivalentERKSt10error_codei]+0x1d2): undefined reference to `boost::system::generic_category()'
/tmp/ccKlWUUd.o: In function `boost::dll::detail::report_error(boost::system::error_code const&, char const*)':
program.cpp:(.text._ZN5boost3dll6detail12report_errorERKNS_6system10error_codeEPKc[_ZN5boost3dll6detail12report_errorERKNS_6system10error_codeEPKc]+0x2a): undefined reference to `dlerror'
/tmp/ccKlWUUd.o: In function `boost::filesystem::read_symlink(boost::filesystem::path const&, boost::system::error_code&)':
program.cpp:(.text._ZN5boost10filesystem12read_symlinkERKNS0_4pathERNS_6system10error_codeE[_ZN5boost10filesystem12read_symlinkERKNS0_4pathERNS_6system10error_codeE]+0x36): undefined reference to `boost::filesystem::detail::read_symlink(boost::filesystem::path const&, boost::system::error_code*)'
collect2: error: ld returned 1 exit status

Система здесь:

gcc: 7.0.3
boost: 1.65.1
libc6: 2.73

1 Ответ

1 голос
/ 26 марта 2019

Ваша команда сборки находится в неправильном порядке, и порядок имеет значение.

GCC читает слева направо, беря символы из библиотек, когда он уже знает, что нуждается в них. Когда вы ставите program.cpp последним, вы не сообщаете об этом до тех пор, пока все перечисленные библиотеки не будут идентифицированы и удалены.

Сначала укажите program.cpp , а затем необходимые библиотеки.

g++ -o program program.cpp -lboost_filesystem -ldl -lboost_system

Да, это немного странно. (Еще более странно, что он работал на Debian! Хотя, по-видимому, только в некоторых «последних» дистрибутивах Linuxy по умолчанию включено --as-needed, что и вызывает поведение, которое вы видите, показывая, что такое поведение не обязательно гарантировано. Возможно, Debian 9 просто не работает сделай это.)


Подробнее:

...