提升有关 zlib 的 iostreams 链接错误

Boost iostreams linking errors regarding zlib

提问人:user3007875 提问时间:6/16/2023 最后编辑:user3007875 更新时间:6/20/2023 访问量:123

问:

Windows 10 64 位,使用编译器 clang-cl 和 CMake。

我编译了这样的提升:

1 将 zlib 源代码下载到C:/zlib-1.2.12

2 在我添加的文件中boost_root/project_config.jam

using zlib : 1.2.12 : <source>C:/zlib-1.2.12 ;

3 编译的 iostreams

b2.exe toolset=clang-win --with-iostreams -s NO_ZLIB=0 link=shared threading=multi runtime-debugging=off variant=release address-model=64 -a

4 在 CMakeLists 中用于我的项目

...
find_package(Boost)
target_link_librares(myproj Boost::iostreams zlib)
...

5 并构建了项目,但出现链接错误

undefined symbol: int const boost::iostreams::zlib::okay
undefined symbol: int const boost::iostreams::zlib::sync_flush
undefined symbol: int const boost::iostreams::zlib::stream_end
undefined symbol: int const boost::iostreams::zlib::default_strategy
undefined symbol: int const boost::iostreams::zlib::deflated
undefined symbol: int const boost::iostreams::zlib::default_compression

我尝试通过在 中指定参数来使用预编译的 zlib,但最终遇到了相同的链接错误。project-config.jam

boost cmake clang iostream zlib

评论

0赞 sehe 6/16/2023
您需要将 zlib 添加到您自己的项目的链接器输入(目标)中myproj
0赞 user3007875 6/17/2023
@sehe我添加了 zlib,但出现了同样的错误。
0赞 sehe 6/17/2023
bootstrap/b2 命令的输出是什么?在开头,它应该提到是否真的找到了 ZLIB。如果没有,它可能只是忽略 ZLIB 请求
1赞 user3007875 6/19/2023
@sehe 如果我在文件中指定并编译 iostreams lib,则在开始时它没有提到 zlib,但确实在位于文件夹中的文件中列出了警告。同样在最后,它说“库已成功构建”,并且它确实在 boost_root/stage/lib 中生成文件。using zlib : 1.2.12 : <source>C:/zlib_1.2.12_bin ;project-config.jamC:/zlib_1.2.12_binz.dll

答:

0赞 sehe 6/19/2023 #1

由于您知道该库存在并且已构建,因此您可以尝试手动添加它,例如:

link_directories(${BOOST_ROOT}/stage/lib)
target_link_libraries(myproj z)

查看我的本地(在 linux 机器上),我可以看到以下变化:FindBoost.cmake

.. versionadded:: 3.7
  ``bzip2`` and ``zlib`` components (Windows only).

很久以后

.. versionadded:: 3.19
  ``bzip2`` and ``zlib`` components on all platforms.

按理说,Boost知道如何做到这一点。事实上,在我对 linux 的简单测试中,链接到组件确实让我获得了 zlib:Boost::iostreams

find_package(Boost 1.79.0 COMPONENTS iostreams)
target_link_libraries(mytarget Boost::iostreams)

展示

ldd build/mutarget
        linux-vdso.so.1 (0x00007ffef0395000)
        libboost_iostreams.so.1.82.0 => /home/sehe/custom/superboost/stage/lib/libboost_iostreams.so.1.82.0 (0x00007f271cdd9000)
        libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f271cb89000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f271cb69000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f271c941000)
        libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f271c925000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f271c83c000)

也许您的 Cmake、Boost 或 FindBoost.cmake 版本太旧了?也许你的 Cmake 没有找到正确的版本?

评论

0赞 user3007875 6/20/2023
我手动链接了z.lib库,但仍然有同样的问题。我正在使用 CMake 3.20 和 Boost 1.81.0,所以它们应该是最新的。我检查了链接命令,它链接了 iostreams 和 z.lib 库。不知道还能尝试什么......