【问题标题】:undefined reference cross compiling static libraries with LTO under GCCGCC下使用LTO的未定义引用交叉编译静态库
【发布时间】:2014-12-09 06:24:16
【问题描述】:

我正在尝试使用 GCC 4.9.2 从 Linux (x86_64-pc-linux-gnu) 为 Windows (x86_64-w64-mingw32) 交叉编译应用程序。

在构建链接静态库的目标并使用链接时优化时,对于目标从库中使用的所有符号,我从链接器收到未定义的引用错误。

例如,从 bar.cpp 构建 bar.a

int bar (void) {return 42;}

并与 foo.cpp 链接

extern int bar (void);
int main (int, char**) {bar ();}

使用命令行

x86_64-w64-mingw32-g++ -flto -o foo.o -c foo.cpp
x86_64-w64-mingw32-g++ -flto -o bar.o -c bar.cpp
x86_64-w64-mingw32-gcc-ar rc bar.a bar.o
x86_64-w64-mingw32-gcc-ranlib bar.a
x86_64-w64-mingw32-g++ -flto -fuse-linker-plugin foo.o bar.a -o foo

导致错误

/tmp/ccc3Twsc.lto.o:foo.o:(.text+0x15): undefined reference to `bar()'
collect2: error: ld returned 1 exit status

从上面:

  • 我正在为 ar/ranlib 使用 gcc 包装器
  • 没有外部依赖项
  • 所有文件都使用相同的选项编译

我尝试过使用 -fuse-linker-plugin、gcc-ar 与 ar、符号可见性选项、优化等的各种组合,但如果不关闭 LTO,我无法正确链接。

所有目标都在本机编译器 (x86_64 Linux) 下正确构建。

我在这里遗漏了什么明显的东西吗?

【问题讨论】:

    标签: c++ gcc mingw cross-compiling lto


    【解决方案1】:

    我能够在 Win7 64 位下的 Mingw32-gcc 4.9.2 上重现此链接问题。但是,我确实通过添加-ffat-lto-objects 作为解决方法使其成功链接:

    g++ -flto -o foo.o -c foo.cpp
    g++ -flto -ffat-lto-objects -o bar.o -c bar.cpp
    ar rc bar.a bar.o
    g++ -flto -o foo.exe foo.o bar.a
    

    【讨论】:

    • 感谢您的确认。不幸的是,-ffat-lto-objects 允许链接器回退到标准的链接方法,并且或多或少地否定了 LTO 用于我的目的(使用许多便利库)。
    • 另外,请注意gcc-ar(与ar 相对)可能是确认ar 不理解LTO/GIMPLE 对象部分的要求。 gcc-{ar,ranlib,nm} 是保留/理解相关部分的临时包装器。
    猜你喜欢
    • 2015-07-12
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 2012-03-08
    • 2015-11-02
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多