如何确保模板类定义成为共享库?

时间:2017-03-15 17:06:51

标签: c++ templates shared-libraries

我正在尝试为一个相当大的项目编译.so,并且我遇到的问题是,在任何文件中编写的模板或其他类都不在已完成的.so文件中。

我用以下文件制作了文件:

g++ -shared -fPIC -Wall filename1.cpp -o libfilename1.so

我将为您提供nm的完整输出,但是所有已定义的非模板化函数都存在,并且没有模板化函数,模板化类或类。我尝试在类声明中使用__attribute__ ((visibility=("default"))),但它似乎没有做任何事情。

1 个答案:

答案 0 :(得分:0)

模板仅在编译期间存在于编译器中。编译器使用模板来创建所述模板的实例化。那些是“真正的”类或功能。它们对链接器是可见的,因此可以放入共享库中。

为了实现这一点,您需要通知正在编译链接库的代码的编译器,该库中存在某个模板的特定实例。这是通过声明显式实例化(在标题中)来完成的:

extern template​ Class<int>; // since C++11

其次,您需要通知编译器,该编译器使用显式模板定义(在库的源代码中)编译所述实例化应存在的库的代码:

template Class<int>;