4

MaxOS-XでC++0xとOgreを使用してC++プロジェクトを移植しようとしていますが、OS-Xバージョン間で移植性の問題が発生します。

GCC4.6.0を使用してMacOS-X10.6(Snow Leopard)でプロジェクトをコンパイルすることに成功しました(C ++ 0xが必要だったため)。大変でしたが(おそらく私が新しいOSXユーザーだったため)、最終的にエラーなしでコンパイルされました。

必要なすべてのコンポーネント、フレームワーク、プラグインなどをApplication.appバンドルに含めましたが、このMacOS-X10.6では正常に起動します。

しかし、Mac OS-X 10.5.8がインストールされている古いラップトップにプロジェクトを転送すると、アプリケーションを実行できません。

.appをダブルクリックすると起動しようとし、最後にメニューバーからアイコンが消えます。これですべてです。しかし、.appに含まれている実行可能ファイルを直接実行すると、次のエラーが返されます。

MacBook-2:~ root# /var/root/Desktop/MyProject.app/Contents/MacOS/MyProject ; exit;
dyld: lazy symbol binding failed: Symbol not found: __ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_i
  Referenced from: /var/root/Desktop/MyProject.app/Contents/MacOS/../Frameworks/Ogre.framework/Versions/1.7.3/Ogre
  Expected in: /usr/lib/libstdc++.6.dylib

dyld: Symbol not found: __ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_i
  Referenced from: /var/root/Desktop/MyProject.app/Contents/MacOS/../Frameworks/Ogre.framework/Versions/1.7.3/Ogre
  Expected in: /usr/lib/libstdc++.6.dylib

Trace/BPT trap
logout

これがアプリケーションバンドルツリービューです。

MyProject.app

  • コンポーネント
    • ... (鬼のコンポーネント)
  • フレームワーク
    • Ogre.framework
  • マックOS
    • MyProject (実行可能)
  • プラグイン
    • ... (Ogreプラグイン)
  • 資力
    • ... (Ogre .cfg +私のアセット)

私はCmakeにMacOSX10.5.sdkを使用するように指示しました(CMakeList.txt内ではなくCmake GUI内で設定):

  • CMAKE_OSX_DEPLOYEMENT_TARGET 10.5
  • CMAKE_OSX_SYSROOT /Developer/SDKs/MacOSX10.5.sdk

しかし、それは何も変わらないようです...


libstdc ++。dylibファイルは、アプリケーションのコンパイルに使用されるMacのlibstdc ++。6.0.9.dylibにリンクしますが、移植性のテストに使用されるMacのlibstdc++。6.0.4.dylibにリンクします。

しかし、MacOSX10.5.sdkを使用するように指示したので、コンパイル時にlibstdc ++。6.0.4.dylibを使用するので、10.5がインストールされたMacで実行できます。

実際の目標は、何も変更せずに2番目のMac(および10.5以降を使用するすべてのMac)で実行できるようにすることです。ダウンロードして実行するだけです...

誰かが私がここで欠けているものを教えてくれますか?(私はOS-Xの方法と構成に精通しているとは感じていないので、非常に基本的なものを見逃していた可能性があります。粗雑になることを恐れないでください^^)。

CmakeでターゲットSDKを指定するにはどうすればよいですか?(使用されているCmakeコマンドは十分ではありませんか?)


私はプロジェクトをコンパイルするために以下を使用します:

  • Mac OS-X 10.6.7
  • GCC 4.6.0
  • Cmake 2.8-4
  • Ogre 1.7.3

私はプロジェクトをテストするために以下を使用します:

  • Mac OS-X 10.5.8(いくつかの開発ツールがインストールされています。アプリケーションに干渉する可能性がある場合に備えて、それを伝えなければならないと思います)。

編集:

ここでotoolを発見したので、返されたログです

Valkeas-Mac:MacOS root# otool -L MyProject 
MyProject:
    @executable_path/../Frameworks/Ogre.framework/Versions/1.7.3/Ogre (compatibility version 0.0.0, current version 1.7.3)
    @executable_path/../Components/libOgreTerrain.dylib (compatibility version 0.0.0, current version 1.7.3)
    /System/Library/Frameworks/Carbon.framework/Versions/A/Carbon (compatibility version 2.0.0, current version 136.0.0)
    /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 12.0.0)
    /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit (compatibility version 1.0.0, current version 275.0.0)
    /opt/local/lib/gcc46/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.15.0)
    /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /opt/local/lib/gcc46/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)
    /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 227.0.0)
    /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 476.19.0)
    /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 949.54.0)
    /System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices (compatibility version 1.0.0, current version 34.0.0)
    /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 677.26.0)
Valkeas-Mac:MacOS root# 

明らかに、gcc46 libstdc ++。6.dylibにリンクしています(このファイルにはGCC4.6.0のC++ 0x関数が含まれていると思うのでおそらく正常です)。

それで、解決策はありますか?(-staticは、動的が必要であることを示すエラーを返します...)

4

2 に答える 2

4

libstdc++使用しているのはgcc4.6のものです。OSXに同梱されているバージョンのgccでは使用できないC++0xを使用しているため、組み込みがlibstdc++機能しないのは当然です。使用しているものをアプリケーションバンドル内に出荷する必要がありlibstdc++.dylibます(たとえば、your.app / Contents / Librariesに入れることができます)。install_name_tool相対パス(@rpathまたはを使用)を使用して参照されていることを確認するために使用し@executable_pathます。

于 2011-06-16T09:42:13.873 に答える
1

選択された答えはおそらく多くの人にとってより実用的ですが、これは実際にはAppleのツールチェーンのバグであり、非常に小さなパッチで簡単に修正されます。C ++ 0xの使用に関する問題のせいにすること、または異なるバージョンのgccの使用に関する問題のせいにすることは確かに正しくありません。このようなものは一般的に機能するはずです。ユーザーとしてこの問題を経験しているように見える人の数を考えると(Google検索で判断すると)、Xcode 5.1でアップストリームで修正できることを願っています(ただし、過去にAppleから簡単な5分間の修正に関して得た独善的な反応を考えると)下位互換性をより適切にサポートするために、私は息を止めていません。この種のことは非常に重要であると考えているので、関係なくレーダーを提出します)。修正は、os​​treamヘッダーを変更して、演算子の周囲に__TARGETING_4_0_DYLIBガードを追加することです<< 文字列の実装。私は自分のウェブサイトにパッチを配置しましたhttp://test.saurik.com/apple/ostream1.diff

于 2014-01-12T13:42:29.927 に答える