5

我正在尝试编译我已声明为类成员的项目:

icu::UnicodeString label;
icu::UnicodeString tags;
icu::UnicodeString domain;
icu::UnicodeString data;

包含后(是的,找到了)

#include <unicode/unistr.h>

在我的 CMakeLists.txt 中,它搜索、查找和链接: icuuc icudata (libicuuc, libicudata) 如输出所示,在抛出错误之前:

-o icarus -rdynamic -lPocoNet -lPocoUtil -lPocoXML -licuuc -licudata

我已经从源 icu4c 50.1.2 构建和安装,并将其安装在 /usr/local/* cmake 正确找到库,因为我的错误来自链接阶段:

icu_50::UnicodeString::UnicodeString()' undefined reference to对icu_50::UnicodeString::~UnicodeString()' 的未定义引用

我在 Debian Wheezy 上使用启用了 -std=c++0x 的 gcc-4.7.2。昨晚在 Debian Squeeze 上使用相同标志的 gcc-4.3.2 编译了完全相同的代码!

我不能为我的生活,弄清楚我做错了什么!请帮忙!

4

1 回答 1

9

看来这是我在构建 ICU4C 时的错。我留下一个简短的解释,因为我已经看到了很多关于此的谷歌帖子,但没有答案。如果您在配置 icu 时仔细阅读文档,它指出您应该做一些事情:

1)将使用命名空间定义为false:

 #   ifndef U_USING_ICU_NAMESPACE
-#       define U_USING_ICU_NAMESPACE 1
+        // Set to 0 to force namespace declarations in ICU usage.
+#       define U_USING_ICU_NAMESPACE 0

2) 在 linux 上构建时,我选择了一个非共享的静态库:

runConfigureICU Linux --enable-static --disable-shared

3)这是导致我的错误的重要部分:

默认情况下,ICU 库入口点名称具有 ICU 版本后缀。将其关闭以进行系统级安装,以在不破坏应用程序的情况下升级 ICU。例如:

runConfigureICU Linux --disable-renaming

必须安装此配置中的公共头文件,应用程序才能包含并获取正确的入口点名称。

我在 Squeeze 上确实这样做了,但在 Wheezy 上没有这样做,因此导致了系统范围安装中的所有链接错误。吸取教训,希望对其他人有所帮助。

于 2013-02-14T13:01:11.803 回答