2

そこで、Linux用のBoost.Extensionサンプルを移植しようとしています

サンプルはここで説明されています。これが私のコードポートです(動物のクラス動物のプロトタイプメインアプリ、一般的なすべてのポートのアイデアはここで説明され現在のLinuxの進歩はここにあります(いくつかのサンプルは実際に必要に応じて機能します!))。このサンプルをLinuxでコンパイルすると、コンパイルすると、動物を含むライブラリが見つかりますが、次のように出力されます。

Animals not found!

これはのみ発生しif(factories.empty())ます。

拡張機能のサンプルをクロスプラットフォームベースに移植しようとしているので、Windowsで同じコードを試しましたが、魅力のように機能します。すべての動物と出力を検索します。

Creating an animal using factory:
Cougar factory Created an animal:
cougar Age: 2 Creating an animal using
factory: Leopard factory Created an
animal: leopard Age: 3 Creating an
animal using factory: Puma factory
Created an animal: puma Age: 4
Creating an animal using factory:
Wildcat factory Created an animal:
wildcat Age: 5

だから...なぜそれは同じコードでLinux上でそのように動作するのですか?なぜそれがWindowsでうまく機能するのですか?

アップデート:

それで、premakeでこのようなものを構築する方法:

  1. ここからsvnを取得します(このフォルダーのみが必要です)
  2. プラットフォームのプリメイクを取得するか、ソースからビルドして、svnからダウンロードしたフォルダーに配置します
  3. 公式のBoostをコンパイルしてインストールする必要があります(ディレクトリにあるReadMe.txtファイルをお読みください)。必要なものは次のとおりです。
    • Boost C ++ライブラリ (バージョン1.4.16でテスト済み)
    • Boost-Extension最新のリビジョンを使用します。boost'boost / extension / **'の一部としてアドレス指定します。拡張機能をブーストするためにいくつかのチャンド(実際には1つのみ)を作成する必要がBoost.Extension.Tutorial/libs/boost/extension/あったため、フォルダー内に提供し、svnをダウンロードしたときに取得しました。 、ヘッダーのみです
    • Boost-Reflection(このチュートリアルのために使用し、最新のリビジョンを使用し、boost'boost /reflection / **'の一部としてアドレス指定します。*簡単にするために、 *に入れることをお勧めしBoost.Extension.Tutorial/libs/boost/reflectionます)
  4. これで、公式のBoostがシステムにあり、ヘッダーのみのBoost-reflectionとBoost-extensionがBoost.Extension.Tutorial/libs/boostフォルダーにあり、premake4実行可能ファイルがBoost.Extension.Tutorial/フォルダー内にある場合、Windowsを呼び出しBoost.Extension.Tutorial/ premake4-build-windows.batてVisualStudioのslnを取得したり Boost.Extension.Tutorial/ premake-build.shmakefileを取得したりできます。
  5. 生成されたソリューション/メイクファイルは、生成されたプロジェクトフォルダー内にあります。
  6. 頑張ってください!=)

アップデート2:

WindowsとLinuxのプロジェクトファイルがsvnに含まれるようになったため、premakeを使用してプロジェクトを作成できます。Boost、svn、およびリフレクションヘッダーのみをlibに設定してください。

4

2 に答える 2

7

Linuxでデバッグしました。朗報です。

あなたは弾丸番号にぶつかっています。ジェレミーパックの投稿から3

RTTIは、DLLの境界を越えて常に期待どおりに機能するとは限りません。type_infoクラスをチェックして、私がそれをどのように処理するかを確認してください。

私は(以下の)小さな回避策パッチを持ってboost/extension/impl/typeinfo.hppいます(しかし、あなたは本当にBoost Extensionのメンテナと話す必要があります)。これが行うことは、RTTItypeinfoの組み込み比較に依存していません。

typeinfo.hppを見ると、Windowsが実際にtypeinfo比較を使用することはないように思われるので、「strcmp」フォールバックメソッドを使用してテストすることにしました。

$ LD_LIBRARY_PATH=. ./Simple-Inheritance 
Creating an animal using factory: Cougar factory
Created an animal: cougar Age: 2
Creating an animal using factory: Leopard factory
Created an animal: leopard Age: 3
Creating an animal using factory: Puma factory
Created an animal: puma Age: 4
Creating an animal using factory: Wildcat factory
Created an animal: wildcat Age: 5

特に、からの型ルックアップconvertible_がtype_map.hppの68行目で失敗することを示すことができます。

  • この変換が拡張dll自体から呼び出されると、変換はRTTIを使用して一致するものを見つけます。
  • ただし、テストアプリケーションから「同じ」.get()が実行されると(DLLの境界を越えて)、RTTIが異なり、そのような一致が見つからず、74/75行目がヒットします。

73        if (it == instances_.end()) {
74          holder = new type_holder<StoredType>;
75          it = instances_.insert(std::make_pair(t, holder)).first;
76        }

パッチ

diff --git a/Boost.Extension.Tutorial/libs/boost/extension/impl/typeinfo.hpp b/Boost.Extension.Tutorial/libs/boost/extension/impl/typeinfo.hpp
index 843fed2..09fc353 100644
--- a/Boost.Extension.Tutorial/libs/boost/extension/impl/typeinfo.hpp
+++ b/Boost.Extension.Tutorial/libs/boost/extension/impl/typeinfo.hpp
@@ -50,7 +50,7 @@ struct type_info_handler<default_type_info, ClassType>

 // This list should be expanded to all platforms that successfully
 // compare type_info across shared library boundaries.
-#if defined(__APPLE__) || defined(__GNUC__) || \
+#if defined(__APPLE__) || \
     defined(BOOST_EXTENSION_FORCE_FAST_TYPEINFO)
 namespace boost {
 namespace extensions {
@@ -90,7 +90,7 @@ inline bool operator>(const default_type_info& first,
 }  // namespace extensions
 }  // namespace boost
 #else  // OTHER OS
-#include <string>
+#include <cstring>
 namespace boost { namespace extensions {
 inline bool operator<(const default_type_info& first,
                const default_type_info& second) {
于 2011-04-30T00:05:38.130 に答える
3

Linux上のGCCには、デフォルトで、Windows上のMSVCよりも厳密なリンカー最適化設定があります。これにより、リンカがクラスを最適化するという理由だけで、クラスが利用可能として登録され、壊れているように見えるファクトリパターンが発生します。私はあなたのコードを見ませんでした-しかし、説明からそれは問題である可能性があります。

参照されていないクラスが削除されないようにする方法に関する回答を含む関連する質問:gccにライブラリから参照されていない静的C++オブジェクトをリンクさせる方法

于 2011-04-29T20:41:20.363 に答える