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

时间:2013-02-14 12:36:46

标签: linker-errors static-linking icu unicode-string gcc4.7

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

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()'

的未定义引用

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

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

1 个答案:

答案 0 :(得分:6)

在构建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

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

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

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

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

runConfigureICU Linux --disable-renaming

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

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