请考虑以下文件。
class A {
public:
A(): foo(0){}
private:
int foo;
};
//extern thread_local A a;
extern A a;
#include "libfoo.h"
//thread_local A a;
A a;
#include <stdio.h>
#include "libfoo.h"
int main(){
printf("%p\n", &a);
}
生成文件
CPP := g++
libPerfGraph.so: Cycles.o PerfGraph.o Util.o
$(CPP) $(CFLAG) -g -std=c++11 -shared -o $@ $+ -lpthread
%.o : %.cc %.h
$(CPP) $(CFLAG) -g -std=c++11 -fPIC -shared -o $@ -c $<
在上面的场景中,一切正常。编译器没有抱怨,也没有运行时错误。
但是,如果我取消注释thread_local
声明并注释掉非thread_local
声明,那么在尝试编译应用时会出现以下令人讨厌的错误。
g++ -o main -std=c++11 main.cc -L. -lFoo
/tmp/ccWmJGng.o: In function `TLS wrapper function for a':
main.cc:(.text._ZTW1a[_ZTW1a]+0x5): undefined reference to `TLS init function for a'
collect2: error: ld returned 1 exit status
make: *** [all] Error 1
如何解决此错误,并成功导出thread_local库变量?