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

ソースicu4c50.1.2からビルドしてインストールし、/ usr / local / *の下にインストールしました。エラーはリンク段階からのものであるため、cmakeはライブラリを正しく検出します。

icu_50::UnicodeString::UnicodeString()' undefined reference toicu_50 :: UnicodeString ::〜UnicodeString()への未定義の参照'

DebianWheezyで-std=c++0xを有効にしてgcc-4.7.2を使用しています。まったく同じコードが、昨夜のDebianSqueezeで同じフラグを使用して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 に答える