我正在尝试编译我已声明为类成员的项目:
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和相同的标志进行编译!
我不能为我的生活,弄清楚我做错了什么!请帮忙!
答案 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上没有,因此在系统范围的安装中导致所有链接错误。 经验教训,希望它可以帮助别人。