web-dev-qa-db-ja.com

C ++ Linux開発環境をセットアップするためにサードパーティのライブラリをどこに配置すればよいですか?

Linuxの初心者ですが、C++の初心者ではありません。 CMakeを使用して、いくつかのサードパーティコンポーネントを含むクロスプラットフォームゲームエンジンをプリコンパイルしていますが、ライブラリの使用については多くの疑問があります。私の質問は、サードパーティのライブラリを使用する方法とそれらをどこに置くかです。 Aptは公式の場所(/ usr/local、/ usr/lib/..)にlibsをインストールしますが、プロジェクトdirのフォルダーにあるローカルlibsを使用してWindowsで開発しています。

また、ライブラリがどのように機能するかのルールを理解するための優れたチュートリアルも必要です。たとえば、プロジェクトをコンパイルしようとすると、luabindはliblua.s0.1を要求しますが、AFAIKには、Luaが提供するソースを使用してこのライブラリを生成する方法がありません(少なくともmake、make installを実行します)。

確かに、この質問はあいまいですが、もっと簡潔にするのに十分な経験がありません。

更新:いくつかの回答を読んだ後、より簡潔な質問は次のとおりです。すべてのサードパーティライブラリをインストールした場合、プログラムをどのように配布できますか?大きなreadmeを使用せずに依存関係を管理するにはどうすればよいですか?

36
Killrazor

ライブラリを置く場所

最善の解決策は、Linuxディストリビューションのパッケージシステム(_apt-get_、yumなど)を使用して、可能な限りディストリビューションが提供するパッケージからライブラリをインストールすることです。

ディストリビューションのパッケージ化されたライブラリーが最新バージョンではない場合、または非標準のビルドオプションが必要な場合、またはディストリビューションが提供していないライブラリーが必要な場合は、自分でビルドしてインストールできます。ライブラリを配置する場所には、主に2つのオプションがあります。

  • _/usr/local_(_/usr/local/lib_のライブラリ、_/usr/local/include_のヘッダ)。これにより、システム全体にライブラリがインストールされ、追加の手順を実行せずにライブラリをビルドできるため、おそらく最も簡単なソリューションです。ライブラリを_/usr_の直下にインストールしないでください。これは、ディストリビューションのパッケージシステムに干渉するためです。
  • Windowsの場合と同様に、プロジェクトディレクトリの下。これには、ルートアクセスを必要とせず、システム全体の変更を行わないという利点がありますが、プロジェクトのインクルードパスとライブラリパスを更新する必要があり、共有ライブラリファイルを 動的リンカーのどこかに配置する必要があります はそれらを見つけることができます(_LD_LIBRARY_PATH_または_ld.so.conf_を使用-詳細はリンクを参照してください)。

ライブラリの仕組み

David A. Wheelerの優れた Programming Library HOWTO を参照してください。それを読んでから、特定の質問を新しいトピックとして投稿することをお勧めします。

プログラムの配布方法

伝統的に、Unix/Linuxプログラムはそれらの依存関係のコピーを含みません。代わりに、これらの依存関係を自分でインストールするかどうかは、エンドユーザーまたは開発者次第です。あなたが言ったように、これは「大きなREADME」を必要とするかもしれませんが、いくつかの利点があります:

  • 追跡する独自のライブラリのセットを持つ各ソースコピーの代わりに、ディストリビューションのパッケージマネージャーを介して開発ライブラリをインストール、管理、および更新できます。
  • システム上の特定のライブラリのコピーは1つしかないため、たとえば、セキュリティ上の欠陥が見つかった場合に更新が必要な場所は1つだけです。 (たとえば、非常に広く使用されている圧縮ライブラリである zlibセキュリティ上の欠陥 が含まれていることが判明したために発生した混乱を考慮してください。更新されます。)
  • プログラムが十分に人気がある(そしてオープンソースであるか、少なくとも無料で利用できる)場合、さまざまなLinuxディストリビューションのパッケージメンテナーは、それをパッケージ化してディストリビューションに含めたいと思うでしょう。パッケージメンテナーは本当にバンドルされたライブラリを好きではありません。たとえば、 トピックに関するFedoraのページ を参照してください。

プログラムをエンドユーザーに配布する場合は、ソースを使用せずに簡単にダウンロードしてインストールできるパッケージ(_.dpkg_または_.rpm_)を提供することを検討してください。理想的には、エンドユーザーの観点から、パッケージはディストリビューションのリポジトリに追加され(オープンソースであるか、少なくとも無料で入手できる場合)、ユーザーがパッケージマネージャー(_apt-get_またはyum)を使用してパッケージをダウンロードできるようにします。 Linuxディストリビューションが多数あるため、これはすべて複雑になる可能性がありますが、Debian/Ubuntu互換の_.dpkg_およびRed Hat/CentOS/Fedora互換の_.rpm_は、かなりの割合のエンドをカバーするはずですユーザー。パッケージの構築はそれほど難しくはなく、オンラインには優れたハウツーがあります。

59
Josh Kelley

windowsに関する質問の最初の部分については、Windowsのライブラリ/ヘッダーには実際の標準的な場所はないため、簡単な解決策は自分で作成することです。システムに単一のlib /とinclude /を提供し、すべてのプロジェクトでそれを使用する(どこにでも含めるcmakeファイルにパスを設定する)。そこにサードパーティのライブラリをすべて入れます。次に例を示します。

あなたのプロジェクト:

d:/projects/projectA
d:/projects/projectB

サードパーティのもの:

d:/api/lib/lua.lib
d:/api/include/lua/....

(バージョンが異なる場合は、シンボリックリンク(別名「ディレクトリジャンクション」)を使用することもできます)

および対応するcmakeファイル:

include_directories( d:/api/include )
link_directories( d:/api/lib )
2
stijn

さて、これは基本的な質問の1つであり、私自身はこれについてあまり明確に出くわさないかもしれませんが、ここに行きます:

  1. プロジェクトをビルドしている間、コンパイラはライブラリのヘッダーファイルを見つける必要があります。ヘッダーはインクルードパスにある必要があります。
  2. コンパイルが完了すると、リンカはライブラリバイナリ(files.soなど)を探します。これらはライブラリパスにある必要があります。

それが基本です。

特定のライブラリーがある場合は、それらを独自のプロジェクト固有のlib/およびinclude/ディレクトリーに追加し、インクルードパスとライブラリーパスにそれぞれ追加できます。

これらのパスへのディレクトリの追加は、プロジェクトの構築方法に応じて、さまざまな方法で実行できます。このすべてにLD_PATHと呼ばれるものがあると確信しています...しかし、CMakeに関連する詳細は本当にわかりません。

少しグーグルすると、CMakeを使用して上記を実行できます。

それが役に立てば幸い
jrh

1
jrharshath

パッケージマネージャーを使用してライブラリをインストールする場合、ライブラリはすべて適切な場所に配置されます。そうでない場合は、-L <path>フラグを使用して追加の検索パスを提供することにより、コンパイラにを検索させることができます。この追加のフラグをCMakeに渡すことができるはずです。

ちなみに、-I <path>は、インクルードファイルを検索するためのディレクトリを追加するために使用できます。

1
doron