当前位置:C++技术网 > 资讯 > [boost] 如何能够避免警告编译boost库的32位和64位版本

[boost] 如何能够避免警告编译boost库的32位和64位版本

更新时间:2017-01-23 18:39:11浏览次数:1+次

    boost库是个很强大的准标准库,基本上不需要编译就可以使用,但是要用某些库时,就需要编译。

    网上搜索很多个编译boost库的方法,可是没有什么好的方法,基本有些就是复制粘贴,有些就是同个方法,显得有点单一,所以又来求助C++技术网。

    我先说明步骤和问题:

    32位:

    1.运行双击运行bootstrap.bat,然后根目录生成b2.exe、bjam.exe这两个主要文件。

    2.听网上的解释说,尽量用b2.exe,编译速度比较快。

    3.双击运行b2.exe就会开始编译。

    4.由于编译输出的调试信息很快,我看到的大多数编译警告都是 warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失 大多数都是出现在.ipp文件上,这或许很多人不关心这个问题,但是我查了查网络,发现这个警告很重要,重要在你在调试的时候下断点直接无效。

    64位:

    1.运行双击运行bootstrap.bat,然后根目录生成b2.exebjam.exe这两个主要文件。

    2.运行 Visual Studio Tools 里自带的 VS2015 x64 本机工具命令提示符。

    3.输入 D: 回车,接着输入 cd boost_1_63_0 回车。(我个人把boost库放在了D盘根目录)

    4.输入bjam.exe stage --toolset=msvc-14.0 --without-python --without-graph --without-graph_parallel --without-math --without-mpi --without-serialization --without-wave --without-atomic --without-chrono --without-random --without-regex --without-test --without-thread --without-program_options --without-serialization --without-signals --stagedir=".\bin\vc14_x64" link=static runtime-link=shared threading=multi debug release address-model=64

    5.还是由于编译输出的调试信息很快,我看到的大多数编译警告都是 (warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失和(warning C4244: “参数”: 从“__int64”转换到“int”,可能丢失数据 又或者 (“参数”: 从“__int64”转换到“unsigned int”,可能丢失数据), 前者警告还是出现在.ipp文件上,后者我没猜错的话,应该是size_t结构类型上了,难道boost库本身就不支持64位吗?

    解决方案:

    1. 出现.ipp文件或许只能用 Unicode 保存了,但是一闪而过太快了,来不及看清,所以只能说写代码出现不能调试时,再改了。

    2. boost库难道真的是不支持64位吗?还是说我的编译方法不对,我查看很多都是用这个方法实现的,我看C++技术网的boost提纲里也提过,不过是32位的,而且我在YouTube上一个外国佬也是这么实现的。

    最后感谢C++技术网的回答。


C++技术网会员解答:

    由于编译输出的调试信息很快,我看到的大多数编译警告都是 warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失。这是文件存储格式不对,会影响到代码正确性。非unicode编码存储到字符如果识别为其他编码字符,就可能出现乱码,不仅是代码问题,甚至编译都通不过。

在vs的文件菜单的高级选项里可以修改编码,然后保存文件。你自己的代码文件要适配库文件的编码。

编译的时候快速闪过警告,如果来不及看,可以使用“生成解决方案”就可以保留警告信息,然后逐一排查。

编译的版本需要对应的版本的库文件和对应版本的编译器支持,我们这里是64位。所以你要确保库文件是64位的。编译器可能也需要单独配置一下编译设置,选择编译的平台是64位。具体设置方法网上有很多资料。

按理说,boost应该是支持64位的,因为提示警告里有__int64,只不过编译却被对应成32了,所以才有的警告。所以问题应该在于编译方式不对,请从这方面来解决。