我们使用Boost构建了一个C ++库,当我们尝试将库集成到二进制文件中时,我们在链接时遇到问题,因为用于构建二进制文件的“--instances = explicit”选项。
问题是,当我们使用--instances = explicit选项(Sun CC编译器)时,它希望我们明确地实例化模板。当我们在使用Boost时使用此选项时Boost内部使用模板,链接器会抛出“未定义的符号”错误 - 这是预期的,因为我们没有明确地实例化Boost中使用的模板。
虽然我理解为什么链接器会抛出错误,但在代码中显式实例化所有boost模板看起来很棘手。因此,想要检查是否有任何解决方案/解决方法使用Boost和Sun CC编译器的“-instances = explicit”选项。
非常感谢任何帮助。
我们可以使用简单的示例代码重现问题 -
#include <iostream>
#include <boost/lexical_cast.hpp>
int main()
{
std::cout<<boost::lexical_cast<int>(“8”)<<std::endl;
}
使用“--instances = explicit”选项
Undefined first referenced
symbol in file
__type_0 boost::detail::lexical_cast<unsigned,std::string,false,char>(__type_0,__type_3*,unsigned) lexical.o
ld: fatal: Symbol referencing errors. No output written to a.out
没有“--instances = explicit”选项,这样可以正常工作。
答案 0 :(得分:2)
您无法组合显式模板实例化和高级模板编程。甚至不要尝试!
从历史上看,其他语言(如ADA)在C ++之前都有模板,但它们使用了显式模板实例化。 C ++是第一个使用隐式模板实例化的主流语言。正是这种变化(从显式到隐式实例化)使现代模板编程技术成为可能。没有隐式模板实例化,就没有STL,也没有Boost。
答案 1 :(得分:2)
错误消息告诉您必须显式实例化哪个模板(例如boost::detail::lexical_cast<unsigned,std::string,false,char>
)这将是很多工作,但是,嘿,你答应编译器这样做。