gpt4 book ai didi

c++ - 安装 ICU 库和编译程序

转载 作者:行者123 更新时间:2023-11-28 05:44:12 26 4
gpt4 key购买 nike

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

按照 ICU 的 page 中的步骤操作,我将 icu4c-57_1-RHEL6-x64.tgz 的内容解压缩到我的 Linux 机器上的/usr/local/include 和/usr/local/bin 中。这足以让人们开始使用 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

这看起来不错吗?

最佳答案

“来自 ICU 页面的步骤”表明......

...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"

...它应该可以工作。

关于c++ - 安装 ICU 库和编译程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36543199/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com