具有链接时间优化和--as ld标志的未定义参考

时间:2019-05-29 21:27:35

标签: c++ linker g++ ld link-time-optimization

我在编译使用链接时间优化的大型C ++项目时遇到了一些麻烦。经过一番挖掘,我设法制作了一个(几乎)最小的工作示例,该示例也出现了同样的问题。

说我有以下 foo.cpp 文件:

//foo.cpp
#include <iostream>
#include "bar.h"

int main()
{
    std::cout << "Hello world" << std::endl;
    //bar(); //Everything works if this is uncommented

    return 0;
}

bar.h bar.cpp 的位置如下:

//bar.h
#ifndef __BAR_H__
#define __BAR_H__

void bar();

#endif

//bar.cpp
#include "bar.h"
#include <thread>

void bar()
{
    std::thread t([] {});
    t.join();
}

代码是这样编译的:

$ g++ -std=c++11 -O3 -flto -c for.cpp
$ g++ -std=c++11 -O3 -flto -c bar.cpp

但是尝试链接目标文件会导致未定义的引用错误:

$ g++ -flto -Wl,-as-needed foo.o bar.o -lpthread
$ /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/8/libstdc++.so: undefined reference to `pthread_create'
$ collect2: error: ld returned 1 exit status

有人可以解释一下这是怎么回事吗?

一些注意事项:

  • 添加-pthread标志没有区别。
  • 我正在根据需要显式传递-Wl选项,因为在我的系统上,这不是默认选项。但是,这是某些其他GNU / Linux发行版中的默认行为。
  • 如果取消注释foo.cpp中对bar()的调用,则链接成功。
  • 如果删除了-Wl,-按需选项(或-Wl,-no-needed选项),则链接成功。
  • 我正在使用g ++ 8.3.0(Debian 8.3.0-6),但在g ++ 7.4.0(Ubuntu 7.4.0-1ubuntu1〜18.04)中也会出现相同的问题。

0 个答案:

没有答案