2017-01-21 8 views
0

私はさまざまなUbuntu LTSバージョン間でアプリケーションを互換性のあるものにする方法を見つけようとしています。しかし異なるUbuntuバージョンでのC++アプリケーションのコンパイルと実行

、それはで終わり、ほとんどの時間「シンボル検索エラー:」またはは「libxxxx.so.xxを見つけることができない」

要件は非常に明確で、開発者は最後の3つのUbuntu LTS(現在は12,14,16-04)バージョンのいずれかでコードをコンパイルできる必要があり、出力は3つのすべての最終バージョンで実行できるはずです。しかし、問題は複雑になっています。

これを行う方法はありますか?

ありがとうございます。

+3

あなたが問題を抱えているライブラリや、コンパイル/リンクのコマンドラインがどのようなものかなど、詳細を投稿してください。 –

+0

私はQtクリエイターを使用していますので、今までのコンパイル/リンクオプションを気にしませんでした。 opencv、ffmpeg(またはavutils)、swscale、cairoなどの例を挙げることができます。gcc自身でさえ、コンパイル時に異なるバージョンのライブラリを使用することがあります。また、いくつかの共有ライブラリは実行時に(起動時ではなく)必要とされるため、別の頭痛です。 –

+0

おそらくあなたはあなたのプロジェクトを構築するためにcmakeを使う方法を尋ねていますか? –

答えて

2

古いディストリビューションでコンパイルされたLinuxバイナリは、です。新しいものと互換性のある一般的にはです。カーネルは、glibcと同様に、後方互換性に多くの努力を払っています。これはすべての図書館では当てはまらないかもしれませんが、私の経験ではそうです。ほとんどの試み。 それで、おそらくあなたがしたいのは、サポートされている最古のディストリビューションでアプリケーションをコンパイルし、新しいアプリケーションで動作する可能性が高いということです。

+0

...より新しいものには、バイナリがビルドされたのと同じランタイムライブラリが用意されています。 –

+0

はい、私は私が思いついたと信じているその警告があります。 –

+1

ヒントが私にとって十分ではないと思うか、コーヒーが少なすぎます。しかし、あなたのものは良い答えであり、私はそれを上回りました。 (別の答えで代替案も提供されています。) –

2

本当に簡単なトリックは、適切なディストリビューションのソースからコンパイルすることです。

Ubuntu/CanonicalがLaunchpadで無料のアカウントを提供するため、これをほぼ自動化することもできます。たとえば、PPAは、特定のリリースのフレーバーで、私が職場、自宅、またはTravis CIで必要とするバックポートまたはパッケージ化されていないソースのいずれかに使用します。

そうでなければ、非常に明白な選択肢はもちろん、スタティックビルドを作成することです。このビルドは特定のリリースのランタイムとは独立しています。それは '永遠に'動くか、カーネルが変わるまで動くでしょう。 Linuxを使用した20年以上の間に、このような変更が一度発生しました(Elf形式の導入に伴い)。

関連する問題