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

Visual c++ 使用自定义ICU构建和使用Boost for Windows Visual Studio 我已经尝试了几天来构建基于UIMA C++框架的项目(http://uima.apache.org/). 我目前使用的是2.4.0版本的候选版本6,它附带Linux和Windows二进制文件,可以轻松捆绑所有依赖项,visual-c++,boost,icu,uima,Visual C++,Boost,Icu,Uima,特别是,它为ICU提供了二进制库(我相信是3.6) 我在项目中,构建了一个C++ uIMA注释器,我的代码使用Boost C++库V1.5 1.0. 一切都可以编译,但在运行时,我在开始使用时会遇到访问冲突异常,比如操作符看看boost/libs/regex/build/has_icu_test.cpp。我不记得我脑海中的修复/问题,但你应该能够作弊,只需从main()返回0。可能Boost对6岁的ICU不起作用。您可以重建UIMA吗?我的命令行如下: bjam -sICU_PATH=c:\ic

特别是,它为ICU提供了二进制库(我相信是3.6)

我在项目中,构建了一个C++ uIMA注释器,我的代码使用Boost C++库V1.5 1.0.


一切都可以编译,但在运行时,我在开始使用时会遇到访问冲突异常,比如操作符看看boost/libs/regex/build/has_icu_test.cpp。我不记得我脑海中的修复/问题,但你应该能够作弊,只需从main()返回0。

可能Boost对6岁的ICU不起作用。您可以重建UIMA吗?

我的命令行如下:

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无论如何都会查找调试库,即使在variant=release被请求时也是如此。

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

只是需要在重症监护室(ICU)建立增强功能(并且成功)。由于这个问题是google上的第一个结果之一(目前没有太大帮助),我决定分享我学到的东西

我正在用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(再次调试和发布)复制到
lib
,并将所有头文件复制到
include
。为了让
bjam
开心,我还必须将完整的
bin
lib
目录分别复制到
bin64
lib64
。如果没有这两个目录,在我的机器上检测ICU或编译Boost.Locale都会失败

有了这个布局,我所要做的就是将
-sICU\u PATH=
添加到我常用的
bjam
命令行中,以使其得以构建

你知道Boost成功检测到ICU如果你同时得到

 - has_icu builds           : yes
[...]
 - icu                      : yes
在配置期间

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

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

如果配置失败,请查看
bin.v2/config.log
,以获取出错原因的详细信息。最有可能的是,它无法在libs/regex/build/has\u icu\u test.cpp上编译测试程序。此日志包含build命令的命令行,通常足以找出错误所在。如果日志似乎可疑为空,则可能忘记删除
项目缓存.jam

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


祝你好运

您粘贴的内容中有\debug\项,因此它似乎试图构建debug。明天将再次检查它。可能是来自--build type=complete的旧日志,而bjam只使用缓存值。但无论如何,这个问题可以通过我的回答中的config.log找到。@Steven R.Loomis刚刚检查了我关于干净构建的假设-配置通过调试完成,但构建从发布开始。所以我的假设是正确的,看起来它是boost build中的一个bug。嗨,
bjam
?@linrongbin引用在哪里可以工作。实际上,您不能链接到实际的icuin.lib并使用icuind.dll运行,反之亦然,但如果只是链接时链接错误,则应该可以。这段代码试图将调试ICU用于生产用途,这有点可怕。我得到了以下两个版本:yes和ICU:yes。我能够编译boost has_icu_test.cpp,但是如果我尝试构建,我会得到以下错误:has_icu.obj:error LNK2001:unresolved external symbol\u charFromName\u 53。我包括ICU\include的路径,ICU\lib的路径为lib路径。我是否应该将一些特定的.lib文件添加到输入/其他依赖项选项中?请告知。
bjam
在哪里?
 - has_icu builds           : yes
[...]
 - icu                      : yes