使用zlib编译boost

时间:2011-02-08 19:59:51

标签: c++ boost compilation zlib

我正在使用Windows 7下的bjam编译提升(64位 - 应该是无关紧要的)

D:\development\boost\boost_1_44\libs\iostreams\build>bjam stage ^
--toolset=msvc-10.0 link=static ^
--build-type=complete ^
-s ZLIB_SOURCE=C:\zlib125-dll ^
-s ZLIB_LIBPATH=C:\zlib125-dll\lib ^
-s ZLIB_INCLUDE=C:\zlib125-dll\include ^
-s ZLIB_BINARY=C:\zlib125-dll

但我只能

stage/libboost_iostreams-vc100-mt-gd-1_44.lib
bin.v2/libs/iostreams/build/msvc-10.0/debug/threading-multi/boost_iostreams-vc100-mt-gd-1_44.dll
bin.v2/libs/iostreams/build/msvc-10.0/debug/threading-multi/boost_iostreams-vc100-mt-gd-1_44.lib

bin.v2/libs/iostreams/build/zlib/msvc-10.0/debug/threading-multi/boost_zlib-vc100-mt-gd-1_44.dll
bin.v2/libs/iostreams/build/zlib/msvc-10.0/debug/threading-multi/boost_zlib-vc100-mt-gd-1_44.lib

但缺少stage/libboost_zlib-vc100-mt-gd-1_44.lib

我编译错了吗?

当我尝试运行与boost和自编译的boost / thread库兼容的项目时,当我包含boost zlib的东西时,我得到以下错误

6>LINK : fatal error LNK1104: cannot open file 'libboost_zlib-vc100-mt-gd-1_44.lib'

有谁知道我做错了什么?

7 个答案:

答案 0 :(得分:15)

我确实设法使用选项
来构建它们 -sZLIB_SOURCE =“C:\ zlib-1.2.5”
请注意,-s和路径周围的引号后面没有空格。

答案 1 :(得分:5)

我需要一段时间才能使用zlib支持正确构建Boost。我在博客上发表了here

总结一下,我遇到的问题是,在某些时候zlib不再包含gzio.c源文件。 Boost构建系统的jamfile(jamfile.v2)引用了gzio模块导致它失败。解决方案是在构建之前删除该引用。

我不确定这个答案是否相关,除非您尝试构建旧版本的Boost。我相信原始构建问题已在更新版本的Boost中得到修复。

答案 2 :(得分:3)

我遇到了同样的问题(Windows 7 Visual Studio),我认为问题不在于如何构建提升。

1)作为ecotax,-s之后不应该有空格 2)运行bjam时,添加标志--debug-configuration。如果在输出中你没有看到错误,它会输出类似

的内容

注意:iostreams:使用预建的zlib

然后它找到了你的zlib副本,这很好。

3)请注意,不应生成库libboost_zlib-vc100-mt-gd-1_44.lib。

4)在Visual Studio中编译应用程序时,似乎Boost.Iostreams自动链接仍然需要libboost_zlib-vc100-mt-gd-1_44.lib并报告链接错误。

它对我有用(我创建谷歌搜索)是​​为预处理器定义添加标志

BOOST_IOSTREAMS_NO_LIB

答案 3 :(得分:1)

对于那些正在编译的人,使用预先构建的' zlib'。 这些步骤需要完成:

  • 下载并构建' zlib'
  • 运行b2.exe --with-iostreams -s ZLIB_BINARY = zlib -s ZLIB_INCLUDE = C:/Sys/zlib-1.2.7/Include -s ZLIB_LIBPATH = C:/Sys/zlib-1.2.7/Lib release

更新本地安装zlib文件夹的路径。这样,Boost将嵌入libboost_iostreams的gzip.cpp,zlib.cpp文件。不会生成libboost_zlib。

  • 在源文件中添加以下行(在stdafx.h中的某处,包括Boost.Iostream头之前):

-

#ifdef _DEBUG
  #define BOOST_ZLIB_BINARY zlibd
#else
  #define BOOST_ZLIB_BINARY zlib
#endif

这告诉您不想链接libboost_zlib,但是您提供了预编译的zlib库。

  • 在项目设置中提供zlib.lib文件的路径。
  • 现在应该编译和链接。

答案 4 :(得分:1)

我在这里结合了其他答案的建议,这就是我所做的:

将zlib提取到C:\ zlib \ zlib-1.2.11。

使用CMake配置和生成MS Visual Studio 2017项目,并使用MS Visual Studio 2017生成项目。我将它构建在适当的位置,以便C:\ zlib \ zlib-1.2.11现在包含(除先前内容之外)目录lib和include。

将Boost 1.67.0提取到C:\ Boost \ boost_1_67_0。

(位于驱动器C:上)

cd \Boost\boost_1_67_0
bootstrap.bat
set ZLIB_SOURCE="C:\zlib\zlib-1.2.11"
set ZLIB_INCLUDE="C:\zlib\zlib-1.2.11\include"
set ZLIB_LIBPATH="C:\zlib\zlib-1.2.11\lib"

以下行构建了libboost_iostreams,并且确实将libboost_zlib文件放入了C:\ Boost \ boost_1_67_0 \ stage \ lib:

b2 --debug-configuration --with-iostreams -sZLIB_SOURCE="C:\zlib\zlib-1.2.11" -sZLIB_INCLUDE="C:\zlib\zlib-1.2.11\include" -sZLIB_LIBPATH="C:\zlib\zlib-1.2.11\lib"

以下代码构建了Boost的其余部分:

b2 -sZLIB_SOURCE="C:\zlib\zlib-1.2.11" -sZLIB_INCLUDE="C:\zlib\zlib-1.2.11\include" -sZLIB_LIBPATH="C:\zlib\zlib-1.2.11\lib"

不知道这是否是最佳方法,但是它确实生成了libboost_zlib lib文件。

答案 5 :(得分:0)

我尝试了各种方法,但很难为较新版本的 boost (1.75.0) 找到正确的解决方案。

所有 -sZLIB_xxx 开关似乎不再起作用。

Boost Documentation 只是声明

<块引用>

在 Windows 上,zlib、bzip2、zstd 和/或 LZMA 二进制文件需要在 PATH 中,否则默认情况下通常不会找到它们,因此在 Windows 下设置 zlib、bzip2、zstd 总是一个好主意和/或您自己的 jamfile 中的 LZMA 工具集。

设置路径并没有带来任何成功,所以我挖掘了更多文档。 Boost 提供的 jam 文档和示例并不是最有用的,因此通过对 Conan boost 包的 Conan Recipe 的分析,我终于想出了这个最小的 user-config.jam 文件,它对我有用:

using zlib : your.zlib.version :
  <include>"path/to/zlib/include/headers"
  <search>"path/to/zlib/library/file" ;

为我执行此操作的最小 b2 命令是:

.\b2.exe --user-config="path/to/user-config.jam"

希望这能对其他人有所帮助,以免他们像我一样浪费很多时间。

答案 6 :(得分:-1)

set ZLIB_SOURCE="c:\zlib"

set ZLIB_INCLUDE="c:\zlib"

.\b2

.\bjam将无法构建,但.\b2将构建库:s tage/libboost_zlib-vc100-mt-gd-1_44.lib