我在编译使用链接时间优化的大型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
有人可以解释一下这是怎么回事吗?
一些注意事项: