4

几天来,我一直在尝试构建一个基于 UIMA C++ 框架(http://uima.apache.org/)的项目。我目前使用的是版本 2.4.0 候选版本 6,它带有 Linux 和 Windows 二进制文件,可以轻松捆绑所有依赖项。

特别是,它带有 ICU 的二进制库(我相信是 3.6)。

在我的项目中,我正在构建一个 C++ UIMA 注释器,并且我的代码使用了 Boost C++ 库 v1.51.0。

一切都编译得很好,但是在运行时,我在开始使用时遇到访问冲突异常,比如说 operator <<(ostream&, const icu::UnicodeString&)。可能是Boost和UIMA C++版本不兼容的问题。

所以,我试图在我的机器上重新编译 Boost,告诉它重用 UIMA C++ 附带的 ICU,但是 MSVC 工具集似乎有问题,因为我总是收到消息告诉我在构建时没有可用的 ICU促进:

c:\Users\Sylvain\boost_1_51_0>b2 toolset=msvc-10.0 variant=release -sICU_LINK=c:\users\sylvain\apache-uima\uimacpp

Building the Boost C++ Libraries.


Performing configuration checks

    - 32-bit                   : yes
    - x86                      : yes
    - has_icu builds           : no
warning: Graph library does not contain MPI-based parallel components.
note: to enable them, add "using mpi ;" to your user-config.jam
    - iconv (libc)             : no
    - iconv (separate)         : no
    - icu                      : no
    - icu (lib64)              : no
    - gcc visibility           : no
    - long double support      : yes

有没有人设法使用 -sICU_PATH 选项和 MSVC 构建 Boost?

谢谢,西尔万

4

5 回答 5

1

只需使用 ICU 构建 Boost(并成功)。由于这个问题是谷歌上的第一个结果(现在没有太大帮助),我决定分享我学到的东西。

我正在使用 MSVC11 (Visual Studio 2012) 进行 Boost 1.56 的 x64 构建,链接到 ICU 4.8.1 的自定义构建。

首先,Boost 对 ICU 的目录检测似乎有点奇怪。这是我对 ICU 目录的最终布局:

my_icu_root
  +- bin
  +- bin64
  +- include
     +- layout
     +- unicode
  +- lib
  +- lib64

我将所有 ICU dll(调试和发布版本)复制到. bin,所有库(再次调试和发布)lib和所有头文件复制到include. 为了bjam开心,我还必须分别将完整 bin目录和lib目录复制到bin64lib64。如果没有这两个目录,ICU 的检测或 Boost.Locale 的编译都会在我的机器上失败。

有了这个布局,我所要做的就是添加-sICU_PATH=<my_icu_root>到我常用的bjam命令行来构建它。

如果您同时获得两者,您就知道 Boost 成功检测到 ICU

 - has_icu builds           : yes
[...]
 - icu                      : yes

在配置过程中。

如果由于某种原因它不能立即工作,这里有一些建议。

Bjam 将配置信息缓存到bin.v2/project-cache.jam. 如果您在配置失败后尝试重新运行 Bjam,请务必先删除该文件。否则 bjam 可能会决定完全跳过 ICU 检测(您会(cached)在控制台输出中看到很多内容)。

如果配置失败,请查看bin.v2/config.log以获取有关问题的详细信息。很可能,它无法在libs/regex/build/has_icu_test.cpp. 该日志包含构建命令的命令行,通常足以找出问题所在。如果日志看起来可疑为空,您可能忘记删除project-cache.jam.

最后,成功的配置运行并不能保证成功的构建。lib在我的机器上,我设法正确配置了所有内容,但由于缺少文件,Boost.locale 在构建过程中仍然失败。因此,请务必检查构建输出中是否存在失败或跳过的目标。

祝你好运!

于 2014-09-01T12:50:47.257 回答
0

我遇到了同样的问题。我选择解决它的方法是复制 icuin.lib 并将其命名为 icund.lib,其他库也是如此。然后 bjam 说它找到了 icu。

于 2012-09-14T07:28:39.780 回答
0

也许 Boost 不适用于六岁的 ICU。你可以重建 UIMA 吗?

于 2012-08-28T19:55:18.017 回答
0

看看 boost/libs/regex/build/has_icu_test.cpp。我不记得我脑海中的修复/问题,但你应该能够作弊并简单地从 main() 那里返回 0。

于 2012-08-27T15:03:50.013 回答
0

我的命令行如下:

bjam -sICU_PATH=c:\icu --toolset=msvc-10.0 variant=release stage

只需查看 \bin.v2\config.log

它包含确切的错误。就我而言,缺少用于链接的特定库

...found 10 targets...
...found 3 targets...
...found 66 targets...
...updating 2 targets...
msvc.link bin.v2\libs\regex\build\msvc-10.0\debug\threading-multi\has_icu.exe
LINK : fatal error LNK1181: cannot open input file 'icuind.lib'

问题是 - boost build 无论如何都会寻找调试库,即使在要求变体 = 发布时也是如此。

于 2012-09-11T15:16:41.733 回答