为什么断言在链接阶段失败?

时间:2019-03-24 10:32:01

标签: c++ static-libraries ld

我想将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 :(得分:0)

此错误意味着<EditText android:id="@+id/editText" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/transparent" android:inputType="textMultiLine" android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"> </EditText> 无法解析至少一个符号。实际上,静态库lto-plugin是使用较旧版本的GCC编译的。例如,如果您尝试使用dds.a读取其中的一个目标文件,则会出现此错误:

lto1

要更正它,您有两种选择:禁用LTO或重新编译$ /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 (如注释中所建议)。

要禁用LTO,可以使用dds.a GCC选项,但会出现另一个错误:

-fno-use-linker-plugin

实际上,对象文件为$ 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 链接到程序的唯一好的解决方案是使用将用于编译最终应用程序的同一编译器对其进行重新编译。