2013-02-14 130 views
4

我试图编译我的项目,我已经声明为类成员的一些:链接错误:未定义参考icu_50 :: ::的UnicodeString的UnicodeString()

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 /本地/ * cmake的找到正确的库,因为我的错误是在链接阶段:

undefined reference to icu_50::UnicodeString::UnicodeString()' undefined reference to icu_50::UnicodeString::~UnicodeString()'

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

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

回答

5

看起来这是我构建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)这是导致我的错误的重要组成部分:

通过高清ault,ICU库入口点名称具有ICU版本后缀。将其关闭以进行系统级安装,以在不中断应用程序的情况下启用ICU升级。例如:必须安装应用程序,包括和得到正确的入口点的名字从这个配置

runConfigureICU Linux --disable-renaming 

公共的头文件。

我在挤压上做了这样的事,但不是在Wheezy上,因此在系统范围的安装上造成了所有的连接错误。 经验教训,希望它可以帮助别人。