0

そこで、標準IDE用のBoost.Extensionサンプルを移植しようとしています。これは、BJAMからタムを解放し、プラットフォーム間で標準的な方法でそれらを操作できるようにするためです

私が今問題を抱えているサンプルはここに記述されています。これが私のコードポートです(メインコードファイルメインアプリケーション、一般的なすべてのポートのアイデアをここで説明し、現在のLinuxの進歩をここで説明します(ほとんどのサンプルは実際に必要に応じて機能します!))。このサンプルを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. 頑張ってください!=)

アップデート:

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

アップデート2: 一般的に私のコンピュータはWindowsとLinuxの両方で問題を示しています。Linuxの詳細( Mono2.10.2を含むopenSUSE11.3 VMWareイメージ)GCC(gcc -v):

rupert@linux:~> gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/i586-suse-linux/4.5/lto-wrapper
Target: i586-suse-linux
Configured with: ../configure --prefix=/usr --infodir=/usr/share/info --mandir=/usr/share/man --libdir=/usr/lib --libexecdir=/usr/lib --enable-languages=c,c++,objc,fortran,obj-c++,java,ada --enable-checking=release --with-gxx-include-dir=/usr/include/c++/4.5 --enable-ssp --disable-libssp --disable-plugin --with-bugurl=http://bugs.opensuse.org/ --with-pkgversion='SUSE Linux' --disable-libgcj --disable-libmudflap --with-slibdir=/lib --with-system-zlib --enable-__cxa_atexit --enable-libstdcxx-allocator=new --disable-libstdcxx-pch --enable-version-specific-runtime-libs --program-suffix=-4.5 --enable-linux-futex --without-system-libunwind --enable-gold --with-plugin-ld=/usr/bin/gold --with-arch-32=i586 --with-tune=generic --build=i586-suse-linux
Thread model: posix
gcc version 4.5.0 20100604 [gcc-4_5-branch revision 160292] (SUSE Linux) 

私のウィンドウは、Visual Studio Team System 2008TeamSuiteを搭載した標準のWindows7です。

私のブーストは、手動でコンパイルおよびインストールされたここからの1.46.1ダウンロードです。

4

1 に答える 1

1

これは私のテストの結果であるため、構成に違いがあるはずです。

  1. cd / tmp
  2. svn checkout http://cloudobserver.googlecode.com/svn/branches/v0.4/ cloudobserver
  3. cd cloudobserver / Boost.Extension.Tutorial / libs / boost /
  4. svn co http://svn.boost.org/svn/boost/sandbox/boost/reflection/
  5. cd ../../projects/linux-gmake/
  6. 作る
  7. cd bin / debug /
  8. LD_LIBRARY_PATH=をエクスポートします。
  9. ./相互運用性

出力:

最初の反射:それはSUVです。2番目の反射:それはコンパクトです。

おそらくリリースブルド?

  1. CD ../..
  2. make -Bs config = release
  3. cd bin / release /
  4. ./相互運用性

最初の反射:それはSUVです。2番目の反射:それはコンパクトです。


アップデート

それ以来、これを32ビットLinuxでテストしました。

  • ubuntu gcc 4.4.5、ブースト1.42.0
  • ubuntu gcc 4.5.1、ブースト1.42.0
  • debian gcc 4.5.2-8、ブースト1.46.1.1
  • debian gcc 4.6.1 20110428(プレリリース)、ブースト1.46.1.1

Mono-2.10.2.vmdkイメージSuSEと

  • gcc 4.5.0 20100604、ブースト1.42.0.7.1.1(yast2リポジトリから)
  • gcc 4.5.0 20100604、ブースト1.46.1(ソースから)

結論、ヒント

テストしたすべてのバージョンで、正確で同一の出力が得られました。確かに何かPEBCAKが起こっているに違いありませんか?おそらく、新しいVMで上記の手順を繰り返して、自分の目で確かめてください

私が本当にうまくいかないのを見ることができる唯一のことは

  • 間違ったライブラリパス(動的にロードする(古い?)互換性のないsoのビルド)
  • 間違ったヘッダーが使用されています(ビルドに互換性がありません)
于 2011-05-01T15:36:08.833 に答える