Почему утверждение не удалось на этапе связывания? - PullRequest
0 голосов
/ 24 марта 2019

Я хочу статически связать libdds.a с простым приложением C ++ (чтобы провести несколько тестов). Вот мой код C ++ (файл называется bridge.cpp):

#include <iostream>

int main()
{
    std::cout << "Hello world!" << std::endl;

    return 0;
}

Этот код на данный момент не использует функции в libdds.a, но я хочу убедиться, что компиляция работает хорошо раньше. Поэтому я пытаюсь скомпилировать:

$ g++ -Wall -o bridge bridge.cpp -L. -ldds
collect2: fatal error: ld terminated with signal 6 [Abandon], core dumped
compilation terminated.
ld: ../../src/lto-plugin/lto-plugin.c :388 : dump_symtab:  assertion « resolution != LDPR_UNKNOWN » failed.

Вот версии g++ и ld:

$ g++ --version
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.11) 5.4.0 20160609
$ ld --version
GNU ld (GNU Binutils for Ubuntu) 2.26.1

Я не использую какую-либо IDE, и я компилирую из командной строки с точной предыдущей командой. Я на Ubuntu 16.04.6 LTS:

$ lsb_release -a
LSB Version:    core-9.20160110ubuntu0.2-amd64:core-9.20160110ubuntu0.2-noarch:printing-9.20160110ubuntu0.2-amd64:printing-9.20160110ubuntu0.2-noarch:security-9.20160110ubuntu0.2-amd64:security-9.20160110ubuntu0.2-noarch
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.6 LTS
Release:    16.04
Codename:   xenial

Что означает эта ошибка и как я могу ее исправить?

1 Ответ

0 голосов
/ 20 апреля 2019

Эта ошибка означает, что по крайней мере один символ не может быть разрешен с помощью lto-plugin.Действительно, статическая библиотека dds.a была скомпилирована с более старой версией GCC.Например, если вы попытаетесь прочитать один объектный файл в нем с помощью lto1, вы получите эту ошибку:

$ /usr/lib/gcc/x86_64-linux-gnu/5/lto1 Par.o
Reading object files: Par.olto1: fatal error: bytecode stream generated with LTO version 2.1 instead of the expected 4.1

Чтобы исправить это, у вас есть два варианта: diable LTO или перекомпилировать dds.a(как предлагается в комментариях).

Чтобы отключить LTO, вы можете использовать опцию -fno-use-linker-plugin GCC, но вы получите другую ошибку:

$ g++ -Wall -fno-use-linker-plugin -o bridge bridge.cpp -L. -ldds
/usr/bin/ld : skipping incompatible ./libdds.a when searching for -ldds

Действительно, файл объектов находится вelf32-i386 формат, и вы пытаетесь связать их с elf64-x86-64 форматом файла:

$ objdump -p Par.o
Par.o:     file format elf32-i386
$ g++ -c bridge.cpp 
$ objdump -p bridge.o 
bridge.o:     file format elf64-x86-64

На данный момент, единственное хорошее решение связать dds.a с вашей программой - это перекомпилировать ее с тем же компиляторомвы будете использовать для составления вашего окончательного заявления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...