33


23

C ++ Linux開発環境をセットアップするためにサードパーティのライブラリを置く場所は?

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

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

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

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

すべての強いテキストをありがとう

4 Answer


52


ライブラリを置く場所

最良の解決策は、Linuxディストリビューションのパッケージングシステム( apt-get、` yum`など)を使用して、可能な限り配布されたパッケージからライブラリをインストールすることです。

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

  • / usr / local(` / usr / local / lib`の下のライブラリ、 / usr / local / include)。 これにより、システム全体にライブラリがインストールされ、おそらく最も簡単なソリューションになります。追加の手順を実行せずにライブラリに対してビルドできるはずです。 ライブラリを `/ usr`の直下にインストールしないでください。ディストリビューションのパッケージングシステムに干渉します。

  • Windowsで行ったように、プロジェクトディレクトリの下。 これは ルートアクセスを必要とせず、システム全体に変更を加えないという利点がありますが、プロジェクトのインクルードパスとライブラリパスを更新する必要があり、共有ライブラリファイルをhttp://www.kernel.orgのどこかに配置する必要があります。 /doc/man-pages/online/pages/man8/ld.so.8.html [動的リンカー]はそれらを見つけることができます( LD_LIBRARY_PATH`または ld.so.conf`を使用-詳細についてはリンクを参照してください)。

ライブラリの仕組み

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

プログラムの配布方法

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

  • 開発ライブラリは、を介してインストール、管理、および更新できます。 ディストリビューションのパッケージマネージャー。追跡する独自のライブラリセットを各ソースコピーの代わりに使用します。

  • システムにはライブラリのコピーが1つしかないため、 たとえば、セキュリティ上の欠陥が見つかった場合、更新が必要な場所は1つだけです。 (たとえば、非常に広く使用されている圧縮ライブラリであるhttp://www.zlib.net/[zlib]がhttp://www.kb.cert.org/vuls/ id / 238678 [セキュリティ上の欠陥]。したがって、影響を受けるバージョンを含むすべてのアプリケーションを更新する必要がありました。)

  • あなたのプログラムが十分に人気がある(そしてオープンソースであるか、少なくとも 自由に利用できます)、さまざまなLinuxディストリビューションのパッケージメンテナーは、パッケージ化してディストリビューションに含めることができます。 パッケージメンテナーは、_本当に_バンドルライブラリを嫌います。 たとえば、http://fedoraproject.org/wiki/Packaging:No_Bundled_Libraries [トピックに関するFedoraのページ]を参照してください。

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


1


さて、これは基本的な質問の1つであり、私自身はこれについてあまりはっきりとは分からないかもしれませんが、ここに行きます:

  1. プロジェクトの構築中に、コンパイラはヘッダーを見つける必要があります ライブラリのファイル。 ヘッダーはインクルードパスに含まれている必要があります。

  2. コンパイルが完了すると、リンカーはライブラリを探します バイナリ(files.soまたはそのようなもの)。 これらはライブラリパスに存在する必要があります。

それが基本です。

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

これらのパスをこれらのパスに追加するには、プロジェクトの構築方法に応じて、さまざまな方法があります。 このすべてにLD_PATHと呼ばれるものが含まれていると確信しています…​ しかし、私はCMakeに関係する詳細を本当に知りません。

少しグーグルでCMakeを使って上記のことを行うことができます。

お役に立てば幸いです、+ jrh


1


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

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


1


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 )