2011-10-10 32 views
2

我们使用Boost构建了一个C++库,当我们尝试将库集成到二进制文件中时,由于用于构建二进制文件的“--instances = explicit”选项,因此在链接时出现问题。在显式模板实例中使用boost

问题是,当我们使用--instances = explicit选项(Sun CC编译器)时,它期望我们明确地实例化模板。由于当Boost使用此选项时,由于Boost内部使用模板,所以链接器会抛出“Undefined symbol”错误 - 这是预期的,因为我们没有明确地实例化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 =明确的”选项

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 =明确的”选项能正常工作。

+1

出于好奇,为什么你需要'--instances = explicit'? –

+1

诀窍是不使用instances = explicit;)Sun CC支持模板缓存我认为,这样实例化不会被冗余编译,所以我不确定为什么要使用该选项。 –

+0

该选项用于控制模板实例化,并由此具有最少量的模板编译和最小对象大小。有没有一种方法可以显式实例化增强模板? –

回答

2

您不能将显式模板实例化和高级模板编程组合在一起。别尝试!

历史上,其他语言(如ADA)在C++之前有模板,但它们使用显式模板实例化。 C++是第一个使用隐式模板实例化的主流语言。正是这种变化(从显式到隐式实例化)使现代模板编程技术成为可能。没有隐式模板实例化,就没有STL,也没有Boost。

1

错误消息告诉你你必须明确实例化哪个模板(例如boost::detail::lexical_cast<unsigned,std::string,false,char>)这将是很多工作,但是,嘿,你承诺编译器去做。