安装 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 包(libicu
、libicu-dev
、.. .).通过包管理器安装有几个优点:
- 它避免了您刚刚遇到的问题。
- 它确保您您用于您的程序的 ICU 版本与其他程序包的程序使用的相同;以链接两个 不同 版本的 ICU 库的二进制文件结束只是自找麻烦。
- 它会自动更新包。
根据您的发行版,您可能无法获得绝对最新的版本,但这通常无关紧要。
一旦您 拥有 正常运行的安装,第三方框架通常会要求您在源文件或构建文件中明确声明一个 include/
子目录,以明确您实际使用的框架。对于 ICU,前缀是(有点不直观)unicode
...并且他们没有在其文档中明确说明这一点,它显示...
#include <unistr.h>
因此,如果您改写...
#include "unicode/coll.h"
...应该可以。
我正在通过编写示例代码探索使用 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 包(libicu
、libicu-dev
、.. .).通过包管理器安装有几个优点:
- 它避免了您刚刚遇到的问题。
- 它确保您您用于您的程序的 ICU 版本与其他程序包的程序使用的相同;以链接两个 不同 版本的 ICU 库的二进制文件结束只是自找麻烦。
- 它会自动更新包。
根据您的发行版,您可能无法获得绝对最新的版本,但这通常无关紧要。
一旦您 拥有 正常运行的安装,第三方框架通常会要求您在源文件或构建文件中明确声明一个 include/
子目录,以明确您实际使用的框架。对于 ICU,前缀是(有点不直观)unicode
...并且他们没有在其文档中明确说明这一点,它显示...
#include <unistr.h>
因此,如果您改写...
#include "unicode/coll.h"
...应该可以。