我已经尝试了几天来构建基于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?
谢谢, 西尔
答案 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
满意,我还必须将完整的 bin
和lib
目录分别复制到bin64
和lib64
。如果没有这两个目录,在我的机器上检测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失败。因此,请务必检查失败或跳过目标的构建输出。