babysloth cber进来看:上午的问题已经解决,我发现一个编译boost需要特别注意的地方。
我这几天由于项目的需要,要用到boost::regex库。我下载了1.28.0版的下来进行编译。
我用nmake /fvc6.mak 顺利编译完vc6的regex库,前几天又装了stlport4.5.3想顺便
也把vc6-stlport.mak也编译一下。结果也顺利完成。然后我用boost网站上的例子跑了一下发现。vc6-stlport.mak的所有库都能正确运行,但是vc6的库编译器都报:
testre.obj : error LNK2001: unresolved external symbol "public: static void __cdecl boost::w32_regex_traits<char>::transform_primary(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > &,class std::basic_string<ch
ar,struct std::char_traits<char>,class std::allocator<char> > const &)" (?transform_primary@?$w32_regex_traits@D@boost@@SAXAAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@ABV34@@Z)
这样的错。
这个问题折腾了我整整一天,到csdn上来问babysloth cber,他们也说不知道。
我甚至想是否代码有问题。后来偶然我编译了一下boost::regex的test里面的vc6.mak
发现编译通过但是,在link的时候竟然要boost_regex_vc6-stlport_mds.lib库才能编译
通过。也就是说test的vc6.mak用的不是vc自代的stl库编译的regex,而是stlport的编译库。我突然想到,是不是可能是编译环境被污染了。因为前几天装stlport的时候我在
vc6的Vcvars32.bat文件中的INCLUDE变量和LIB都加了stlport的路径。而且每次编译regex的时候都要先执行Vcvars32.bat,那么就有可能在编译vc6的时候,编译器使用的stl库就不是vc6自代的,而是stlport的。这样编译环境就被污染了。结果从新把regex的库用干净的编译环境编译一下,所有的vc6库都能正常使用了。因此在编译库的时候千万
要是干净的编译环境,否则像stl这种标准库,每个厂商的接口都一致编译的时候不会报错
但是如果真的调用他们的时候,就会因为不同的内部实现而报错。现在我把Vcvars32.bat分成两个文件一个存放干净的vc编译环境,一个存放stlport的编译环境。
另外我发现用jam编译的regex库不管vc+自带stl还是vc+stlport都不能使用。我还没有找到原因不过我已经给boost::regex的作者 John_Maddock@compuserve.com 发了一封
mail希望能够会有答案。