安装 ICU 库和编译程序

Installing ICU libraries and compiling program

我正在通过编写示例代码探索使用 IBM 的 ICU 来处理 Unicode 字符串。

按照 ICU page 的步骤,我将 icu4c-57_1-RHEL6-x64.tgz 的内容解压到 /usr/local/include 和 /usr/local/bin,在我的 Linux 盒子。这足以让人们开始使用 ICU 库吗?

示例代码:

#include <iostream>
#include <string.h>
#include <locale.h>
#include "unicode/coll.h"
#include "unicode/utypes.h"

using namespace icu;
using namespace std;

int main()
{
    UErrorCode success = U_ZERO_ERROR;
    Collator *collator = Collator::createInstance(success);
    collator->setStrength(Collator::PRIMARY);

    if (collator->compare("débárquér", "debarquer") == 0) {
        cout << "Strings are equal" << endl;
    } else {
        cout << "Strings are unequal" << endl;
    }
    return 0;
}

此代码编译失败:

$ g++ unicode.cc
/tmp/ccUknunM.o: In function `main':
unicode.cc:(.text+0x20): undefined reference to `icu_4_2::Collator::createInstance(UErrorCode&)'
unicode.cc:(.text+0x61): undefined reference to `icu_4_2::UnicodeString::UnicodeString(char const*)'
unicode.cc:(.text+0x72): undefined reference to `icu_4_2::UnicodeString::UnicodeString(char const*)'
unicode.cc:(.text+0x97): undefined reference to `icu_4_2::UnicodeString::~UnicodeString()'
unicode.cc:(.text+0xaa): undefined reference to `icu_4_2::UnicodeString::~UnicodeString()'
unicode.cc:(.text+0xc3): undefined reference to `icu_4_2::UnicodeString::~UnicodeString()'
unicode.cc:(.text+0xdd): undefined reference to `icu_4_2::UnicodeString::~UnicodeString()'
collect2: ld returned 1 exit status

从输出来看,ICU 安装似乎不正确或不完整。我错过了什么?

谢谢!

编辑:

当我搜索文件 coll.h 时,这是我看到的:

$ find /usr/local/ -name coll.h
/usr/local/bin/usr/local/include/unicode/coll.h
/usr/local/include/usr/local/include/unicode/coll.h

这样好看吗?

"steps from the ICU page" 指出...

...the .tgz file unpacks to a "/usr/local" type hierarchy.

正在查看存档内容...

$ tar tzf icu4c-57_1-RHEL6-x64.tgz
readme.txt
usr/
usr/local/
usr/local/lib/
usr/local/lib/libicudata.so.57.1
usr/local/lib/libicudata.so
usr/local/lib/libicudata.so.57
...

...您应该将该存档提取到 root (/),而不是一次提取到 /usr/local/bin 一次提取到 /usr/local/include 和你一样。 (你的 find 结果中的路径重复应该是一个提示。不,它看起来根本不正常。)


也就是说,您 真正 应该做的是检查您的发行版的包管理器中的 ICU 包(libiculibicu-dev、.. .).通过包管理器安装有几个优点:

  • 它避免了您刚刚遇到的问题。
  • 它确保您用于您的程序的 ICU 版本与其他程序包的程序使用的相同;以链接两个 不同 版本的 ICU 库的二进制文件结束只是自找麻烦。
  • 它会自动更新包。

根据您的发行版,您可能无法获得绝对最新的版本,但这通常无关紧要。


一旦您 拥有 正常运行的安装,第三方框架通常会要求您在源文件或构建文件中明确声明一个 include/ 子目录,以明确您实际使用的框架。对于 ICU,前缀是(有点不直观)unicode...并且他们没有在其文档中明确说明这一点,它显示...

#include <unistr.h>

因此,如果您改写...

#include "unicode/coll.h"

...应该可以。