使用STLport和第三方库共存产生LNK2005的错误解决方法

 

最近按照教程尝试播放ogg文件,但是发现ogg文件的载入比较慢。于是将考虑的重点放在标准STL里面了。由于买了一本Boost的书,里面讲到STLport是一个开源的软件库,并且比标准VS2005的STL的执行效率更高。于是我就抱着试一试的想法下载并且安装了STLport。安装的方法这里就不再赘述。这里着重讲一讲当STLport和第三方库(在我这里的情况是OggVorbis库)共存时产生的错误怎么解决。

       安装完STLport后,我本以为它能够在不改动源代码的情况下进行顺利的编辑和连接。不料出现了一个严重的连接错误:LNK2005。如下图所示:

使用STLport和第三方库共存产生LNK2005的错误解决方法_第1张图片

       产生这样的错误真是让我一头雾水。怎么这么多的标准库都存在错误呢?这不应该成为问题啊。我疯狂了。冷静下来,分析问题的症结。首先我想到的就是我的项目的设置:是不是这个呢?

       我尝试着将网上的“_STLP_USE_STATIC_LIB”字符输入至项目属性中,然后重新编译连接,结果还是这个结果。那么是不是其它的问题呢?我又对准了一个开关。

使用STLport和第三方库共存产生LNK2005的错误解决方法_第2张图片

       我将/MD和/MDd都调整成了/MT和/MTd(其中/MT代表Release版,/MTd代表Debug版)。然后重新编译连接,结果还是这样。我就度过了郁闷的一天。

       晚上思考连接错误信息:“>LINK : warning LNK4098: 默认库“MSVCRT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library”,我就想找找/NODEFAULTLIB这个开关。今天一来就寻找。结果没有这个开关,而找到了这样一个/Zl开关:

使用STLport和第三方库共存产生LNK2005的错误解决方法_第3张图片

       我想:是不是在编译Ogg和Vorbis静态库的时候都选择了不省略默认库的名称呢?想到这里,我赶紧把Ogg和Vorbis重新编译了一遍,这一次我选择了“是/Zl”开关,然后编译连接,幸运的是,成功了。我把生成的库运用在我的项目上,结果也成功了。原来是这样一个问题啊:STLport编译的时候选择的是不省略默认库的名称,而Ogg和Vorbis也是选择了这个选项,结果都定义了_errno以及_malloc等符号,产生了LNK2005的错误。我选择的是将Ogg和Vorbis的默认库符号去掉了,当然了,理论上STLport的库在编译的时候也是可以去掉默认库的符号的,但是我还没有试过,因为STLport的确有些复杂。解决了这个问题,我心中的石头终于落了地,以后可以睡一个安稳觉啦。

你可能感兴趣的:(使用STLport和第三方库共存产生LNK2005的错误解决方法)