如何在构建Boost后列出失败的目标?

11

我正在使用mingw-4.8.1在Windows上构建boost,并有一些目标失败了。我的问题是,我不知道哪些具体目标失败了,哪些被跳过了。

有没有办法在构建完成后列出失败/跳过的目标?

这是控制台输出:

...failed updating 20 targets...
...skipped 28 targets...
...updated 5789 targets...
在下载并解压 Boost 后使用的命令:
bootstrap

在完成 b2.exe 的构建后,我在命令提示符中执行以下命令:

b2 -j4 --build-dir=build toolset=gcc --build-type=complete --stagedir=C:\SW\Boost -sNO_BZIP2=1

操作系统: Windows 7 (英特尔i5 vPro)
编译器: gcc (mingw 4.8.1)
Boost库版本: boost 1.61.0


2
尝试再次运行构建命令,它应该会很快地处理完工作目标,让你获得更少的信息。这样你就可以更容易地发现哪些库失败了。顺便说一下,你的总结让我想起了我在使用boost时遇到的类似问题。使用默认的user_config.hpp文件解决了我的问题。 - Jan Henke
感谢 @JanHenke。我再次运行了它,但是一些Python库没有构建成功。使用 --without-python 排除了这些库并再次运行了命令。现在有 12 个目标失败 而不是 20_。难道没有其他方法吗?此外,_user_config.hpp 对您的修复到底起了什么作用呢?谢谢您的回复。 - Tomar
boost/config/user.hpp 文件中,你可以设置一些全局选项,主要是关于 boost 如何尝试与你的应用程序链接。重点是,你应该使用默认设置编译最初的 boost 库。如果系统上没有安装 Python,则可能无法编译 Python 库。 - Jan Henke
@JanHenke 好的。虽然我系统上安装了Python,并且它也在PATH路径下,但现在不需要它。有些东西出错了,涉及到_serialisation_和_xml_woarchive.o以及_utf8_codecvt_facet_。 - Tomar
2个回答

10

我遇到了同样的问题。经过一些研究,我发现这是查看失败原因的最佳方法。

我的错误消息(根据您的设备,可能会看到不同的消息):

...failed updating 6 targets...
...skipped 6 targets...
...updated 1092 targets...

我运行./b2 -q

这将在第一次出现错误时停止运行,例如在我的情况下:

gcc.compile.c++ bin.v2/libs/iostreams/build/gcc-4.8.3/release/threading-multi/bzip2.o
libs/iostreams/src/bzip2.cpp:20:56: fatal error: bzlib.h: No such file or directory
 #include "bzlib.h"  // Julian Seward's "bzip.h" header.
                                                        ^
compilation terminated.

    "g++"  -ftemplate-depth-128 -O3 -finline-functions -Wno-inline -Wall -pthread -fPIC -m64  -DBOOST_ALL_NO_LIB=1 -DBOOST_IOSTREAMS_DYN_LINK=1 -DBOOST_IOSTREAMS_USE_DEPRECATED -DNDEBUG  -I"." -c -o "bin.v2/libs/iostreams/build/gcc-4.8.3/release/threading-multi/bzip2.o" "libs/iostreams/src/bzip2.cpp"

...failed gcc.compile.c++ bin.v2/libs/iostreams/build/gcc-4.8.3/release/threading-multi/bzip2.o...
...failed updating 1 target...

然后您可以安装缺失的依赖项,并查看第二个缺失的依赖项。 要查看每一个错误,您需要逐个安装依赖项。如果您决定进行完整的boost构建,则这是很好的选择。 就我的情况而言,我编译了bzip库http://www.bzip.org/downloads.html。 这个库有点棘手。在Linux上,Boost需要动态版本。

make -f Makefile-libbz2_so
你需要手动将libbz2.so.1.0.6文件复制到/usr/local/lib。 然后创建两个符号链接。
libbz2.so.1 -> libbz2.so.1.0.6
libbz2.so -> libbz2.so.1

在此之后,我的加速可以实现,我看到:

The Boost C++ Libraries were successfully built!

或尝试使用./b2 -s NO_BZIP2 = 1跳过。


2

因此,进一步的研究得出以下结果。

可以使用b2 [options]获取构建配置和其他构建输出。
b2 --help显示可以使用的选项。我使用了以下方法来诊断哪些目标失败或被跳过。

方法1
如@JanHenke在评论中建议的那样,我运行了相同的命令

b2 -j4 --build-dir=build toolset=gcc --build-type=complete --stagedir=C:\SW\Boost -sNO_BZIP2=1

(如问题所述) 再次提醒。
结果: 所有已构建的目标都会被跳过,只显示失败的目标。
问题: 如果有许多目标失败,则会在控制台上引起淹没,很难找出发生了什么。

方法2
运行命令(参见1),并使用右键单击从命令提示符中选择所有内容,然后单击获取以将其复制并粘贴到文本编辑器中,以便进行搜索。
结果: 通过搜索failederror关键字可以得出可用的见解。
问题: 仍不是最佳方式,因为当前cmd窗口上没有所有信息。

方法3 未完成,因为对我来说方法2有效,但肯定有效
创建一个batchfile,其中写入命令,并使用>>>运算符将在cmd窗口中打印的所有内容记录在文本文件中。

结果: 这将是目前我所知道的最好的方法,可以了解哪些确切的目标正在失败,并采取适当的诊断措施。

PS: 我发现使用MinGW构建序列化库时存在错误。下面是我遇到的错误以及一个链接,指向讨论同一错误的boost论坛。

gcc.compile.c++ build\boost\bin.v2\libs\serialization\build\gcc-mingw-4.8.1\debug\xml_woarchive.o
In file included from ./boost/archive/detail/utf8_codecvt_facet.hpp:23:0,
                 from ./boost/archive/impl/xml_woarchive_impl.ipp:34,
                 from libs\serialization\src\xml_woarchive.cpp:28:
./boost/detail/utf8_codecvt_facet.hpp:116:30: error:  
 function 'boost::archive::detail::utf8_codecvt_facet::utf8_codecvt_facet(std::size_t)'
definition is marked dllimport  

更多信息请参考参考1参考2
不幸的是,我们还没有找到解决方案。而且,这也不是本问题的范围。


更新: 就我的情况而言,失败的目标包括8个Python和12个序列化库。现在我已经使用“--without-LIBRARYNAME”选项将它们排除在外,因此构建是干净的。 - Tomar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接