链接错误:对icu_50 :: UnicodeString :: UnicodeString()的未定义引用

Æle*_*lex 4 linker-errors unicode-string icu static-linking gcc4.7

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

icu::UnicodeString label;
icu::UnicodeString tags;
icu::UnicodeString domain;
icu::UnicodeString data;
Run Code Online (Sandbox Code Playgroud)

包括之后(是的,它被发现)

#include <unicode/unistr.h>
Run Code Online (Sandbox Code Playgroud)

在我的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 toicu_50 :: UnicodeString :: ~UnicodeString()'

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

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

Æle*_*lex 7

在构建ICU4C时,这似乎是我的错.我将留下一个简短的解释,因为我已经看到很多谷歌帖子,但没有答案.如果在配置icu时仔细阅读了文档,则说明您应该执行以下操作:

1)将namespace命名为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
Run Code Online (Sandbox Code Playgroud)

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

runConfigureICU Linux --enable-static --disable-shared
Run Code Online (Sandbox Code Playgroud)

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

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

runConfigureICU Linux --disable-renaming
Run Code Online (Sandbox Code Playgroud)

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

我在Squeeze上做了这个,但在Wheezy上没有,因此在系统范围的安装中导致所有链接错误.经验教训,希望它能帮助别人.