Linux用C ++ライブラリをリリースしたいです。 (他のライブラリが動的にリンクされていない場合)他のLinuxディストリビューションとの互換性を決定するのはglibcバージョンだけです。
複数の仮想マシンを設定してコンパイルするよりも、過去5年間でほとんどのLinuxディストリビューションをサポートするより良い方法はありますか?たとえば、非常に古いLinuxシステムでコンパイルされたLinuxバイナリは新しいLinuxバージョンで実行されますか?
答え1
LinuxカーネルAPIは非常に安定しています。 (カーネル内のAPIではなくシステムコールについて話しています。)1997年頃から生成された静的リンク実行ファイル(変換非常に低い周波数実行可能な形式では、現在はすべてのLinuxシステムで動作する必要があります。ただし、静的にリンクされた実行可能ファイルにはいくつかの欠点があります。かさばり、サードパーティのコードでバグが見つかると簡単にアップグレードできず、特定のシステム機能と対話する際に問題が発生するため、独自のバブルに存在する傾向があります。標準ライブラリは、これに対する設定可能なサポートを提供します(例:DNS、ロケール、ユーザーアカウント...)。
ライブラリの一般的な規則は、バージョンの最初の数字に対する変更が互換性のないABIの変更を表し、バージョンの残りの部分は、以前のバージョンと互換性のある変更に応じて増加することです。たとえば、プログラムがバージョン 2.3 に接続されている場合、ライブラリーのバージョン 2.3 または 2.4 では機能しますが、2.2 または 3 では機能しません。一部のライブラリは異なるルールを使用します。動的リンカーの使用法ソナムバージョンが適切であることを確認するためにライブラリに書き込まれます。
非組み込みLinuxの標準ライブラリは次のとおりです。glibc。 1998年頃からLinuxでは、Glibcのメジャーバージョンは6です(したがってlibc6という名前)。アップストリームのメジャーバージョンは2です。これは、libc6がバージョン2の理由を説明します。未成年者6の代わりに。未成年者。原則として、以前のバージョンのlibc6に関連付けられたプログラムは最新バージョンでも機能するはずですが、当初は必ずしもそうではありませんでした。 Glibc 2.3以降に関連付けられているすべてのプログラムは現在のバージョンで実行する必要があります。
標準のC++ライブラリは過去に急速に変更されましたが、現在のメジャーバージョン(6)は2005年頃からリリースされました。
古いシステムでプログラムをコンパイルする場合は、必要なライブラリバージョンが利用可能な場合は、最新のシステムで実行する必要があります。取るサポートされている最も古いバージョンのCentOS(現在5)と最も古い[古い]安定したDebianリリース(現在はスクイズはまだ資格があるかもしれませんが)両方の両方で実行されているバイナリをビルドすると、すべてのLinuxインストールで動作する可能性があります(セキュリティアップデートが利用できなくなったバージョンのシステムである組み込みシステムとランタイム未使用システムを除く)。
答え2
はい、ほとんどの場合、新しいカーネル機能を避ける必要があるかもしれません。
移植可能なC ++プログラムを作成するには、公式のISO C ++標準に準拠することをお勧めします。標準が変更されるにつれて手順を調整する必要があるかもしれませんが、通常これは多くの作業ではありません。
プログラムが古いライブラリを持つコンピュータでコンパイルされないことを避けるために、g ++に以前の標準に従うように依頼することができます。コンパイラの定義は次のとおりです。
-D__STRICT_ANSI__ -D_ISOC99_SOURCE=1 -D_ISOC9X_SOURCE=1
(Cの場合)。
もちろん、ハードウェアの問題もあります(ターゲットCPUにはIA64などのアーキテクチャ、SSEなどのCPU機能が含まれています)。