使用自定义ICU构建和使用Boost for Windows Visual Studio

时间:2012-08-27 13:05:53

标签: visual-c++ boost icu uima

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

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

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

所有内容编译都很好但是在运行时,我在开始使用时会遇到Access Violation异常,让我们说运算符<<(ostream&,const icu :: UnicodeString&)。这可能是Boost和UIMA C ++之间版本不兼容的问题。

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

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?

谢谢, 西尔

5 个答案:

答案 0 :(得分:0)

看一下boost / libs / regex / build / has_icu_test.cpp。我不记得我头顶的修复/问题,但你应该能够作弊,只需从main()那里返回0。

答案 1 :(得分:0)

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

答案 2 :(得分: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'

问题是 - 即使在为variant = release请求时,boost build仍会查找调试库。

答案 3 :(得分:0)

我遇到了同样的问题。我选择解决它的方法是制作icuin.lib的副本并将其命名为icuind.lib,以及其他libs。然后bjam说它找到了icu。

答案 4 :(得分:0)

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

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

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

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

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

使用这种布局,我所要做的就是将-sICU_PATH=<my_icu_root>添加到我通常的bjam命令行中以使其构建。

你知道如果你同时使用了Boost,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编译测试程序。此日志包含build命令的命令行,通常足以找出出错的地方。如果日志似乎空洞,您可能忘记删除project-cache.jam

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

祝你好运!