【问题标题】:How can I use lto with static libraries?如何将 lto 与静态库一起使用?
【发布时间】:2014-09-16 21:05:16
【问题描述】:

当我尝试使用 -flto 构建静态库时,出现未定义的引用错误:

library.cpp

#include <iostream>

void foo() {
  std::cout << "Test!" << std::endl;
}

ma​​in.cpp

void foo();

int main() {
  foo();
  return 0;
}

编译输出

$ g++ -flto -c library.cpp
$ ar rcs library.a library.o
$ g++ -flto main.cpp library.a
/tmp/ccZIgxCY.ltrans0.ltrans.o: In function `main':
ccZIgxCY.ltrans0.o:(.text+0x5): undefined reference to `foo()'
collect2: error: ld returned 1 exit status

如果我链接到library.o 而不是library.a,它工作正常。我错过了什么?这是 GCC 4.9.1 和 binutils 2.24。

【问题讨论】:

  • 你试过g++ -flto -lrary main.cpp吗?
  • @πάνταῥεῖ 也坏了。但我在写问题时找到了答案,它贴在下面。

标签: c++ gcc lto


【解决方案1】:

正如我从 GCC 开发人员 Honza Hubička 的 this 帖子中发现的那样,答案是单独使用 gcc-ar 包装器而不是 ar

$ gcc-ar rcs library.a library.o

这会使用正确的插件参数调用ar,在我的例子中是

--plugin /usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.1/liblto_plugin.so

【讨论】:

  • 值得注意的是,还有gcc-ranlibgcc-nm,如果你需要的话。
  • @rodrigo 确实 - 似乎ar 只是图片的一部分。我还需要用gcc-ranlib 覆盖,因为系统默认值无法处理LTO 对象。因此,由于似乎很难找到任何接近单线解决方案的方法:我让 LTO 的工作方式如下:./configure --prefix=/opt/testmake AR=gcc-ar RANLIB=gcc-ranlib CXXFLAGS='-O3 -flto'
  • @underscore_d 正如man ranlib 所说,它等同于ar s。我用gcc-ar rcs创建了我所有的静态库,只需要一步。
【解决方案2】:

作为补充答案:使用 GCC 还可以使用 -ffat-lto-objects,它将经典目标代码添加到存档中的文件中。这使得在没有 -flto 的情况下构建的代码中使用静态库成为可能。

【讨论】:

  • 问题是当使用胖对象时很难发现 LTO 失败的地方
猜你喜欢
  • 2014-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 2023-01-20
  • 2012-07-09
  • 1970-01-01
相关资源
最近更新 更多