4

私の C++ アプリは、GCC、MongoDB C++ ドライバー、および Boost に依存しています。私の現在の方法は、OS の一貫性を保つことです。Ubuntu 12.04 64bit デスクトップで C++ を開発し、Ubuntu 12.04 64bit サーバーにデプロイします。また、ターゲット サーバーに同じバージョンの依存関係をインストールする必要があります。しかし、Ubuntu 13.04 で C++ アプリを開発し、最新の Boost、MongoDB ドライバー、および GCC 4.8.1 を使用する場合、Ubuntu 12.04 サーバーに C++ アプリを簡単に展開できます。

  1. 静的リンク
  2. 動的リンク、すべての依存関係もターゲット サーバーにデプロイしますか?

どの方法が簡単ですか?ターゲット サーバーでライブラリをコンパイルできないことがあります。

4

2 に答える 2

2

依存関係が小さい場合、最も簡単な方法はすべてを静的にコンパイルすることです。ビルドステップはかなり簡単で、特別なことは何も必要ありません。ただし、より大きなライブラリとより大きなプロジェクトでは、これは不便になる可能性があります。

ベストプラクティスは、依存関係を共有オブジェクトにコンパイルし、それらをバイナリに沿って出荷し、ld最初に自分のものを探す方法で実行することだと思います。LD_LIBRARY_PATHたとえば、 egを使用することで可能だと思いますLD_LIBRARY_PATH=/where/did/i/ship/lib:$LD_LIBRARY_PATH my_binary

ビルド システムをセットアップして共有オブジェクトとしてコンパイルし、すべてを適切にパックする必要があるため、やや面倒な場合があります。

Linux 用に出荷されたプリコンパイル済みプログラムのいくつかは、このように動作すると確信しています。不思議なことに、現時点ではカスタムのプリコンパイル済みアプリを見つけることができません。

于 2013-07-26T01:17:54.060 に答える
0

アプリケーションによって異なります。アプリケーションが 1 つの特定のバイナリのみで構成されている場合は、すべての C++ ライブラリを静的にリンクする必要があります。C ABI は変更されないため、すべての C ライブラリを安全に動的にリンクできます。これにより、バージョンの依存関係が残るだけです。ただし、ほとんどの場合、主要な SO-Name バージョンはほぼ互換性があり、異なる主要な SO-Name のライブラリを並行してインストールできます。したがって、パッケージマネージャーに依存してそれらをインストールします。C++ ライブラリは、共通の ABI がないため注意が必要です。単なるコンパイラのバージョンアップでも、互換性がなくなる可能性があります*ため息*。

于 2013-07-26T00:32:04.337 に答える