如何使用g ++ 4.8.1,ld 2.23.52正确导出thread_local变量?

时间:2014-12-03 00:52:36

标签: c++ c++11 g++

请考虑以下文件。

libfoo.h

class A {
    public:
        A(): foo(0){}
    private:
        int foo;    
};

//extern thread_local A a;
extern  A a;

libfoo.cc

#include "libfoo.h"

//thread_local A a;
A a;

main.cc

#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库变量?

0 个答案:

没有答案