23

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

图书馆.cpp

#include <iostream>

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

主.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。

4

2 回答 2

29

正如我从GCC 开发人员 Honza Hubička 的这篇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
于 2014-09-16T21:05:16.033 回答
6

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

于 2019-02-06T13:06:34.977 回答