Неопределенный символ в протоколе с построением gcc 11

#c #gcc #protocol-buffers

Вопрос:

Я пытаюсь создать буфер протокола, следуя этим инструкциям.

Вот что я сделал.

 git clone https://github.com/protocolbuffers/protobuf.git
cd protobuf
git submodule update --init --recursive
./autogen.sh
./configure
make -j6
 

После успешной сборки я проверил

 ldd -d src/.libs/protoc
 

На нем было много неопределенных символов.

 root@renju-mc:~/.../protobuf# ldd -d src/.libs/protoc
        linux-vdso.so.1 (0x00007fff1f3a5000)
        libprotoc.so.28 => not found
        libstdc  .so.6 => /usr/lib/x86_64-linux-gnu/libstdc  .so.6 (0x00007fdce230c000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fdce20f4000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fdce1d03000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fdce1965000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fdce291d000)
undefined symbol: _ZN6google8protobuf8compiler20CommandLineInterface12AllowPluginsERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE       (src/.libs/protoc)
undefined symbol: _ZN6google8protobuf8compiler20CommandLineInterface3RunEiPKPKc (src/.libs/protoc)
undefined symbol: _ZN6google8protobuf8compiler20CommandLineInterfaceD1Ev        (src/.libs/protoc)
undefined symbol: _ZN6google8protobuf8compiler6csharp9GeneratorC1Ev     (src/.libs/protoc)
undefined symbol: _ZN6google8protobuf8compiler6python9GeneratorC1Ev     (src/.libs/protoc)
undefined symbol: _ZN6google8protobuf8compiler20CommandLineInterface17RegisterGeneratorERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESA_PNS1_13CodeGeneratorESA_   (src/.libs/protoc)
undefined symbol: _ZN6google8protobuf8compiler20CommandLineInterfaceC1Ev        (src/.libs/protoc)
undefined symbol: _ZN6google8protobuf8compiler4java13JavaGeneratorD1Ev  (src/.libs/protoc)
undefined symbol: _ZN6google8protobuf8compiler13CodeGeneratorD2Ev       (src/.libs/protoc)
undefined symbol: _ZN6google8protobuf8compiler4java15KotlinGeneratorC1Ev        (src/.libs/protoc)
undefined symbol: _ZN6google8protobuf8compiler6csharp9GeneratorD1Ev     (src/.libs/protoc)
undefined symbol: _ZN6google8protobuf8compiler3cpp12CppGeneratorD1Ev    (src/.libs/protoc)
undefined symbol: _ZN6google8protobuf8compiler10objectivec19ObjectiveCGeneratorC1Ev     (src/.libs/protoc)
undefined symbol: _ZN6google8protobuf8compiler4java15KotlinGeneratorD1Ev        (src/.libs/protoc)
undefined symbol: _ZN6google8protobuf8compiler10objectivec19ObjectiveCGeneratorD1Ev     (src/.libs/protoc)
undefined symbol: _ZN6google8protobuf8compiler3cpp12CppGeneratorC1Ev    (src/.libs/protoc)
undefined symbol: _ZN6google8protobuf8compiler4java13JavaGeneratorC1Ev  (src/.libs/protoc)
undefined symbol: _ZN6google8protobuf8compiler6python9GeneratorD1Ev     (src/.libs/protoc)
 

libprotoc.so.28 => not found этот файл находится в том же месте, что и протокол.

 root@renju-mc:~/.../protobuf# ls -l src/.libs/libprotoc.so.28
lrwxrwxrwx 1 root root 19 Jul 25 22:20 src/.libs/libprotoc.so.28 -> libprotoc.so.28.0.3
 

Я использую Ubuntu 18.04 с gcc-11.

 gcc version 11.1.0 (Ubuntu 11.1.0-1ubuntu1~18.04.1)
 

Ответ №1:

Загрузчик Linux ld.so по умолчанию загружает библиотеки не из текущего каталога, а только из предопределенных местоположений.

Вы пытаетесь загрузить библиотеку из текущего каталога, которая зависит от другой библиотеки в текущем каталоге, отсюда сбой загрузки.

ld.so на странице руководства объясняется, как настроить LD_LIBRARY_PATH , чтобы изменить это поведение.

Ответ №2:

Вероятно, это будет работать лучше, если вы будете следовать всем инструкциям, включая шаг «выполнить установку». Обычно «сделайте установку» размещает встроенные динамические библиотеки в каком-нибудь стандартном месте, например /usr/local/lib, где их найдет динамический компоновщик.

Если вы по какой-то причине не хотите устанавливать программное обеспечение, вы можете использовать переменную среды LD_LIBRARY_PATH, чтобы указать свой нестандартный каталог, содержащий динамические библиотеки. Пример: экспорт LD_LIBRARY_PATH=src/.libs