我正在尝试为一个相当大的项目编译.so,并且我遇到的问题是,在任何文件中编写的模板或其他类都不在已完成的.so文件中。
我用以下文件制作了文件:
g++ -shared -fPIC -Wall filename1.cpp -o libfilename1.so
我将为您提供nm的完整输出,但是所有已定义的非模板化函数都存在,并且没有模板化函数,模板化类或类。我尝试在类声明中使用__attribute__ ((visibility=("default")))
,但它似乎没有做任何事情。
答案 0 :(得分:0)
模板仅在编译期间存在于编译器中。编译器使用模板来创建所述模板的实例化。那些是“真正的”类或功能。它们对链接器是可见的,因此可以放入共享库中。
为了实现这一点,您需要通知正在编译链接库的代码的编译器,该库中存在某个模板的特定实例。这是通过声明显式实例化(在标题中)来完成的:
extern template Class<int>; // since C++11
其次,您需要通知编译器,该编译器使用显式模板定义(在库的源代码中)编译所述实例化应存在的库的代码:
template Class<int>;