2

クロスプラットフォーム アプリケーションを開発しており、マシン A でコンパイルされたアプリケーションをマシン B で実行できるかどうかを判断する必要があります。

私は Qt を使用していますが、Qt ライブラリをアプリケーションと一緒にパッケージ化するか、Qt 自体に静的にリンクする必要があることを既に理解しています。

また、Windows でコンパイルされたものは Linux で実行できないことも理解しています。

しかし、それらがどの程度重要なのか、私にはよくわからないベクトルが他にもいくつかあります。これが私の現在の理解の要約です:

携帯性に影響

  • オペレーティング システム (Windows、Mac、Linux)
  • サードパーティ ライブラリの可用性 (Qt、静的リンクと動的リンクなど)

携帯性に影響する可能性があります

  • Linux のフレーバー (Ubuntu、Red Hat、Fedora)
  • アーキテクチャ (32 または 64 ビット)
  • オペレーティング システムのバージョン (Windows 7 と Windows XP、Rhel5 と Rhel6)
  • 命令タイプ (i386、x64)

移植性に影響する可能性のあるアイテムのうち、実際に影響するのはどれですか? 私が行方不明になっているものはありますか?

4

4 に答える 4

2

全て。少なくとも潜在的に。

2 つの異なるマシンにバイナリ互換性がない場合 (たとえば、それらが異なるアーキテクチャで実行されている、または互換性のないシステムとインターフェイスしている)、両方で実行される単一のバイナリを作成することは不可能です。(または... Linux で Wine の下で Windows プログラムを実行することはカウントされますか?)

それ以外の場合は、依存します。サードパーティのライブラリについて言及しています。それらが動的にロードされる場合、それらはそこにある必要がありますが、常に静的リンクがあり、動的ライブラリを使用してデプロイする方法がある場合があります。

32 ビットと 64 ビットはアーキテクチャの違いです。32 ビット プログラムは 64 ビット環境では実行されず、その逆も同様です。ただし、最新のシステムのほとんど は、64 ビット マシン上にある場合、両方の環境を利用できるようにします。

OS のフレーバーやバージョンなどの問題はより複雑です。もちろん、最近OSに追加された機能を使用すると、追加前のOSのマシンでは動作しません。そうでない場合: 低レベルのシステム ライブラリが動的に読み込まれる主な理由は、上位互換性と下位互換性をサポートするためです。常に機能するとは限らないと聞いたことがありますが、問題には、よりまれな機能のいくつかが関係しているのではないかと思います. (これには制限があります。最新の Windows プログラムはWindows95 では動作しません。また、その逆も同様です。)

さまざまなオプション パッケージがインストールされているかどうかについても問題があります。Qt は Linux または Solaris で X Windows を必要とします。私は Linux や Solaris がインストールされていない (そしてディスプレイ デバイスさえない) ボックスで多くの作業を行ってきました。

そして、それが受け入れられるかどうかという問題があります。テストしたマシンよりも小さくて古いマシンで実行される可能性がありますが、狂ったようにページングされて、使用できなくなる可能性があります。

于 2013-07-12T17:04:55.647 に答える
0

移植性を妨げる 3 つのことがすぐに思い浮かびます。しかし、コードが両方のシステムで認識されるファイル形式であり、両方のシステムで認識される命令セットであり、両方のシステムで認識されるシステム コールのみを作成する場合、コードはおそらく両方のシステムで実行されるはずです。

  • 実行ファイル形式
    • Windows は、PE、COFF、COM、PEF、.NET などを認識します
    • Linux ではデフォルトで ELF、OUT、その他
    • MaxOSX は Mach-O を使用
    • Linux には、Windows/Mac フォーマット (Wine、Mono...) を実行するための拡張機能もあります。
  • 指図書
    • 各プロセッサは少し異なりますが、
    • 通常、ターゲットにできる「最小公分母」があります。
      • コンパイラは、関数を 2 回実行するコードを記述することがあります。
      • 1つはLCDセット、もう1つは「より高速な」命令セット
      • コードは実行時に正しいものを選択します。
    • x64 は 64 ビットと 32 ビットを実行できますが、16 ビットは実行できません。
    • x86 は 32 ビットと 16 ビットを実行できますが、64 ビットは実行できません。
  • オペレーティング システムの呼び出し
    • 通常、各 OS には異なる呼び出しがあります。
    • これは、OS を直接呼び出す代わりに、動的ライブラリを使用することで回避できます。
      • など... C ランタイム ライブラリ。
      • または、.Net の CLR。
于 2013-07-12T17:07:16.860 に答える
0

Linux のフレーバーやオペレーティング システムのバージョンが異なると、システム ライブラリが異なる場合があります。たとえば、このGetModuleFileNameEx機能は Windows XP 以降でのみ使用できます。ただし、使用する機能を監視している限り、それほど問題にはなりません。

x64 アーキテクチャは x86 (「32 ビット」) と下位互換性があるため、x86 用にコンパイルされたプログラムは x64 マシンで実行できますが、その逆はありません。ARM や PowerPC など、あまり一般的ではない他のアーキテクチャもあることに注意してください。

于 2013-07-12T16:58:08.777 に答える
0

64 ビット プロセッサでアプリケーションをコンパイルすると、既定では 32 ビット プロセッサでは実行されません。ただし、オプションをコンパイラに渡して、32 ビット プロセッサで実行するコードをコンパイルさせることができます。たとえば、64 ビット マシンで GCC を使用している場合、 を渡す-m32と、32 ビット コードがコンパイルされます。デフォルトで 32 ビット コードは 64 ビット マシンで実行できます。

ソース

https://stackoverflow.com/a/3501880/193973

于 2013-07-12T16:54:45.017 に答える