g cc игнорирует явно указанные связанные библиотеки, которые будут связаны - PullRequest
0 голосов
/ 18 марта 2020

Я использовал CMake / vcpkg для управления зависимостями моих программ на C ++ и столкнулся с проблемой компоновки на Linux.

Моя программа зависит от библиотеки X (точнее, arrow), а библиотека X внутренне зависит от другой библиотеки Y (RE2 в данном случае). Когда я связал свою программу с библиотекой X, связывание работало на macOS X (Apple clang 11), но не работало на debian (g ++ 9.3), символы отчета в библиотеке Y не были найдены, а отсутствующие символы все еще сообщались компоновщиком в Linux, даже если я явно связал библиотеку Y с моей программой напрямую.

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

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

Вот сообщение об ошибке:

/usr/bin/ld: /vcpkg/installed/x64-linux/debug/lib/libarrow.a(gdv_function_stubs.cc.o): in function `bool re2::RE2::FullMatch<>(re2::StringPiece const&, re2::RE2 const&)':
/vcpkg/installed/x64-linux/include/re2/re2.h:368: undefined reference to `re2::RE2::FullMatchN(re2::StringPiece const&, re2::RE2 const&, re2::RE2::Arg const* const*, int)'
...