ソースから物事をコンパイルすることを学ぶ(Unix / Linux / OSX上)


47

パッケージ(MacPorts / apt-get)から可能な限りソフトウェアをインストールしますが、ソースからパッケージをコンパイルする必要があることがよくあります。./configure && make && sudo make install通常は十分ですが、動作しない場合があります。動作しない場合、頻繁に行き詰まります。ほとんどの場合、これは何らかの形で他のライブラリの依存関係に関連しています。

次のことを学びたい:

  • どの引数を渡すかをどのように把握し./configureますか?
  • 共有ライブラリがOS X / Linuxでどのように機能するか-ファイルシステム上のどこにあるか、どのように./configure && make見つけるか、リンクされたときに実際に何が起こるか
  • 共有ライブラリと静的リンクライブラリの実際の違いは何ですか?なぜすべてを静的にリンクすることができず(RAMとディスクスペースは最近安い)、それゆえ奇妙なライブラリバージョンの競合を避けることができないのですか?
  • インストールしたライブラリとバージョンを確認するにはどうすればよいですか?
  • 通常のシステムを壊さずに、ライブラリの複数のバージョンをインストールする方法を教えてください。
  • 私は場合は午前それ以外のパッケージを使用して管理されているシステム上のソースからのものをインストールし、そうすることのクリーンな方法は何ですか?
  • なんとかソースから何かをコンパイルすることができたと仮定すると、それを他の人が同じフープを飛び越える必要がないようにパッケージ化するにはどうすればよいですか?特にOS Xでは...
  • このようなことをうまく行うために習得する必要があるコマンドラインツールは何ですか?otool、pkg-configなどのようなもの

ここでかなりの時間と労力を費やしたいと思っています-必ずしも上記の質問に対する直接的な回答が欲しいわけではありません。実際に何が起こっているのかを理解し、それによって自分で問題を見つけ出す必要がある知識。

回答:


40

私はすべてに直接答えたことをおpoびしますが、有用なチュートリアルやFAQなどは知りません。基本的に、続くのは8年間のデスクトップアプリの作成(配布を支援する)、フラストレーション、グーグルです。

1. ./configureに渡す引数を調べるにはどうすればよいですか?

本当に練習してください。Autotoolsは一貫しているので簡単です。しかし、cmakeまたはカスタムビルドスクリプトを使用したものはたくさんあります。通常、設定するために何も渡す必要はありません。システムがfoo-toolをビルドできるかどうかを判断する必要があります。

構成ツールおよびGNUツールはすべて、/、/ usr、および/ usr / localで依存関係を探します。他の場所に何かをインストールする場合(MacPortsまたはFinkによって依存関係がインストールされた場合は面倒になります)、GNUツールがこれらの依存関係を検出できるように、シェルの環境を構成または変更するフラグを渡す必要があります。

2.共有ライブラリがOS X / Linuxでどのように機能するか-ファイルシステム上のどこにあるか、。/ configure && makeがそれらを見つける方法、リンクされたときに実際に何が起こるか

Linuxでは、動的リンカーが検出できるパスにインストールする必要があります。これは、LD_LIBRARY_PATH環境変数と/etc/ld.confの内容によって定義されます。Macでは、ほとんどのオープンソースソフトウェアでほぼ同じです(Xcodeプロジェクトでない限り)。env変数がDYLD_LIBRARY_PATH代わりにあります。

リンカがライブラリを検索するデフォルトのパスがあります。/ lib:/ usr / lib:/ usr / local / libです

これを補完するには、CPATH変数、CFLAGS、または他の多くの環境変数を実際に(便利に複雑に)使用します。CFLAGSを次のように提案します。

export CFLAGS = "$ CFLAGS -L / new / path"

-Lパラメーターは、リンクパスに追加します。

最新のものはpkg-configツールを使用しています。最新のものをインストールすると、ライブラリ、ライブラリの場所、リンク方法を説明する.pcファイルもインストールされます。これにより、生活が楽になります。ただし、OS X 10.5には付属していないため、これもインストールする必要があります。また、多くの基本的なサポートではサポートされていません。

リンクの動作は「実行時にこの関数を解決する」だけで、実際には大きな文字列テーブルです。

3.共有ライブラリと静的リンクライブラリの実際の違いは何ですか?なぜすべてを静的にリンクすることができず(RAMとディスクスペースは最近安い)、それゆえ奇妙なライブラリバージョンの競合を避けることができないのですか?

静的ライブラリファイルにリンクすると、コードはアプリケーションの一部になります。そのライブラリ用の巨大な.cファイルが1つあり、それをアプリケーションにコンパイルした場合のようになります。

動的ライブラリには同じコードがありますが、アプリを実行すると、実行時にコードがアプリにロードされます(簡単な説明)。

すべてに静的にリンクできますが、残念ながら、どのビルドシステムでもこれを簡単にすることはできません。ビルドシステムファイルを手動で編集する必要があります(Makefile.am、CMakeLists.txtなど)。ただし、異なるバージョンのライブラリを必要とするものを定期的にインストールし、依存関係を並行してインストールするのが難しい場合、これはおそらく学ぶ価値があります。

コツは、リンク行を-lfooから-l / path / to / static / foo.aに変更することです

おそらく見つけて交換できます。その後、ldd fooまたはotool -L fooを使用して、ツールが.soまたはdylibにリンクしていないことを確認します

別の問題は、すべてのライブラリが静的ライブラリにコンパイルされるわけではないことです。多くの人が行います。しかし、MacPortsまたはDebianは、それを出荷しないことを決定したかもしれません。

4.インストールしたライブラリとバージョンを確認するにはどうすればよいですか?

これらのライブラリ用のpkg-configファイルがある場合は簡単です。

pkg-config --list-all

そうでないと、簡単にできないことがよくあります。dylibには、ライブラリのバージョンと同じsoname(つまり、foo.0.1.dylib、sonameは0.1)が含まれている場合があります。ただし、これは必須ではありません。sonameはバイナリ計算機能です。ライブラリ内の関数の形式を変更する場合は、sonameの大部分をバンプする必要があります。したがって、たとえば 2.0ライブラリのバージョン14.0.5 soname。これは一般的ではありませんが。

私はこの種のことに不満を抱き、Macでこれに対する解決策を開発しました。次にそれについて話します。

5.通常のシステムを壊さずに、複数のバージョンのライブラリをインストールする方法を教えてください。

これに対する私の解決策はこちらです:http : //github.com/mxcl/homebrew/

私はソースからインストールするのが好きで、それを簡単にするが、いくつかのパッケージ管理を備えたツールが欲しかった。したがって、Homebrewを使用してビルドします。ソースから自分自身を取得しますが、必ず特別なプレフィックスにインストールしてください:

/usr/local/Cellar/wget/1.1.4

それから、homebrewツールを使用してすべてを/ usr / localにシンボリックリンクするので、/ usr / local / bin / wgetと/usr/local/lib/libwget.dylibがまだあります。

後で別のバージョンのwgetが必要な場合は、並行してインストールし、/ usr / localツリーにリンクされているバージョンを変更するだけです。

6.パッケージを使用して管理されているシステムにソースからのものをインストールする場合、最もクリーンな方法は何ですか?

Homebrewの方法は最もクリーンだと思うので、それを使用するか、同等の方法を実行します。/ usr / local / pkgs / name / versionにインストールし、残りをシンボリックリンクまたはハードリンクします。

/ usr / localを使用してください。存在するすべてのビルドツールは、そこで依存関係とヘッダーを検索します。あなたの人生はずっと楽になります。

7.なんとかソースから何かをコンパイルすることができたと仮定すると、それを他の人が同じフープをジャンプする必要がないようにパッケージ化する方法はありますか?特にOS Xでは...

依存関係がない場合は、ビルドディレクトリをtarして、「make install」を実行できる他の人に渡すことができます。ただし、これはOS Xのまったく同じバージョンでのみ確実に行うことができます。Linuxでは、おそらく同じカーネルバージョンとlibcマイナーバージョンの同様のLinux(Ubuntuなど)で動作します。

Unixでバイナリを配布するのが簡単ではない理由は、バイナリの互換性のためです。GNUの人々、および他のすべての人は、バイナリインターフェイスを頻繁に変更します。

基本的に、バイナリを配布しないでください。物事はおそらく非常に奇妙な方法で壊れるでしょう。

Macでは、最適なオプションはmacportsパッケージを作成することです。誰もがmacportsを使用します。Linuxには非常に多くの異なるビルドシステムと組み合わせがありますが、奇妙な構成でxツールを構築した方法についてブログエントリを書くことほど良いアドバイスはないと思います。

パッケージの説明(macportsまたはhomebrew用)を作成すると、誰でもそのパッケージをインストールでき、依存関係の問題も解決します。ただし、これは多くの場合簡単ではなく、macportsレシピをメインのmacportsツリーに含めるのも簡単ではありません。また、macportsはエキゾチックなインストールタイプをサポートしていません。すべてのパッケージに対して1つの選択肢を提供します。

Homebrewの今後の目標の1つは、Webサイト上のリンクをクリックできるようにすることです(例:homebrew://blah。Rubyスクリプトをダウンロードし、そのパッケージのdepsをインストールしてからアプリをビルドします)。まだ完了していませんが、私が選んだデザインを考えるとそれほどトリッキーではありません。

8.このようなことをうまく行うために習得する必要があるコマンドラインツールは何ですか?otool、pkg-configなどのようなもの

otoolはその後、本当に役立つだけです。ビルドされたバイナリのリンク先を示します。構築する必要があるツールの依存関係を把握している場合、それは役に立ちません。pkg-configについても同様です。使用する前に依存関係を既にインストールしているためです。

私のツールチェーンは、READMEファイルとINSTALLファイルを読み、configure --helpを実行します。ビルド出力を見て、それが正常であることを確認します。ビルドエラーを解析します。将来的には、serverfaultで質問してください:)


2
興味深いことに、HomebrewはPortage(Gentoo Linuxのパッケージマネージャー)によく似ています。素敵な作品のようですね。
デビッドZ

12

これは巨大なトピックですので、(LinuxのELFとOS X上のMach-O)Linux上で共有ライブラリと開始でき、ウルリック・ドレパーは良い持っているのDSOを書き込んを紹介して利用できるLinux上で共有ライブラリのいくつかの歴史をカバーしている(動的共有オブジェクト)ここにそれらが重要である理由を含む

Ulrichはまた、静的リンクがここで重要なポイントの1つであると考えられる理由をセキュリティ更新プログラムについて説明しています。静的に広範囲にリンクされている共通ライブラリ(zlibなど)のバッファオーバーフローは、ディストリビューションに大きなオーバーヘッドを引き起こす可能性があります-これはzlib 1.1.3で発生しました(Red Hatアドバイザリ

エルフ

リンカーld.soのマニュアルページ

man ld.so 

ランタイムダイナミックリンクに関係する基本的なパスとファイルについて説明します。最新のLinuxシステムでは、/ etc / ld.so.conf.d /を介して追加された追加のパスが、通常は/etc/ld.so.confに含まれるglobを介して追加されます。

ld.so構成を介して動的に利用可能なものを確認したい場合は、実行できます

ldconfig -v -N -X

DSOのハウツーを読むと、OS XのMach-Oにこれらの原則がどのように適用されるかを理解するために、基本的な知識が得られます。

マッハオー

OS Xでは、バイナリ形式はMach-Oです。リンカのローカルシステムドキュメントは

man dyld

マッハ形式のドキュメントは、アップルから入手可能です。

UNIXビルドツール

一般的にはconfiguremakemake installプロセスが一般的に持っているGNUのautotoolsのによって提供されるオンラインブックのconfigure /ビルドスプリットとGNUツールチェーンの歴史の一部をカバーしています。Autoconfは、テストを使用してターゲットビルドシステム上の機能の可用性を判断し、M4マクロ言語を使用してこれを実行します。Automakeは基本的にMakefileのテンプレートメソッドであり、テンプレートは一般にMakefile.amと呼ばれ、autoconf(configureスクリプト)の出力がMakefileに変換されるMakefile.inを出力します。

GNUのハロープログラムは、GNUツールチェーンを理解するための良い例として機能-とマニュアルはautotoolsのマニュアルが含まれています。


10

サイモン!お気持ち察します; Linuxの学習のこの部分にも苦労しました。私自身の経験に基づいて、あなたが対処するいくつかの項目に関するチュートリアルを作成しました(主に自分自身への参照として!):http : //easyaspy.blogspot.com/2008/12/buildinginstalling-application-from.html。Pythonアプリケーションを構築/インストールするのがいかに簡単であるかについての私のメモに感謝するでしょう。:)

これが役立つことを願っています!そして、ハッピーコンパイル。

ティム・ジョーンズ


Ubuntu Linuxでソースからアプリケーションをビルド/インストールする

Ubuntuリポジトリには優れたアプリケーションがぎっしり詰まっていますが、リポジトリにない(またはDebianパッケージがない)必要なツールに出くわすこともあるでしょう。リポジトリよりも新しいバージョン。職業はなんですか?さて、ソースからアプリケーションを構築する必要があります!心配する必要はありません。実際にはそれほど複雑ではありません。ランクアマチュアになってからの私の経験に基づいて、いくつかのヒントを紹介します!(この例ではUbuntuを使用していますが、一般的な概念は、FedoraなどのほとんどのUnix / Linuxディストリビューションや、Windows上のCygwinプラットフォームにも適用できるはずです。)

ソースからほとんどのアプリケーションを構築(コンパイル)する基本プロセスは、configure-> compile-> installのシーケンスに従います。これらを行うための典型的なUnix / Linuxコマンドは、config-> make-> make installです。場合によっては、これらすべてを1つのコマンドに結合できることを示すWebページもあります。

$ config && make && make install

もちろん、このコマンドは、これらの手順のいずれにも問題がないことを前提としています。ここからが楽しみです!

入門

以前にシステムのソースからアプリケーションをコンパイルしたことがない場合は、おそらくgccコンパイラスイートなどの一般的な開発ツール、いくつかの一般的なヘッダーファイル(これは既に記述されたコードと考えてください)インストールしているプログラムで使用されている他の誰か)、およびmakeツール。幸いなことに、Ubuntuには、build-essentialこれをインストールするというメタパッケージがあります。それをインストールするには(または、すでに持っていることを確認してください!)、ターミナルで次のコマンドを実行します。

$ sudo apt-get install build-essential

基本的なセットアップが完了したので、アプリケーションのソースファイルをダウンロードし、「ホーム」ディレクトリなどの読み取り/書き込み権限を持つディレクトリに保存します。通常、これらは、いずれかのファイル拡張子を持つアーカイブファイルになります.tar.gz.tar.bz2。これは、.tar単に「テープアーカイブ」であることを意味します。これは、相対的なディレクトリ構造を保持するファイルのグループです。.gzこれは、人気のあるUnix / Linux圧縮形式であるgzip(GNU zip)の略です。同様に、.bz2bzip2 の略で、gzipよりも高い圧縮(圧縮ファイルサイズが小さい)を提供する新しい圧縮形式です。

ソースファイルをダウンロードしたら、ターミナルウィンドウ(Ubuntuメニューの[システムターミナル])を開き、ファイルを保存したディレクトリに移動します。(~/downloadこの例で使用します。ここでは、「〜」は「ホーム」ディレクトリへのショートカットです。)tarコマンドを使用して、ダウンロードしたアーカイブファイルからファイルを抽出します。

ファイルがgzipアーカイブ(たとえば、で終わる.tar.gz)の場合、次のコマンドを使用します。

            $ tar -zxvf filename.tar.gz

ファイルがbzip2アーカイブ(たとえば、で終わる.tar.bz2)の場合、次のコマンドを使用します。

            $ tar -jxvf filename.tar.gz

ヒント:アーカイブを抽出するためのすべてのコマンドラインスイッチを覚える必要がない場合は、dtrx(私のお気に入り!)またはdeco(より一般的)のユーティリティのいずれか(または両方)を入手することをお勧めします。これらのユーティリティのいずれかを使用すると、ユーティリティの名前(dtrxまたはdeco)とファイル名を入力するだけで、残りのすべてが実行されます。これらは両方とも、遭遇する可能性が高いアーカイブ形式のほとんどを処理する方法を「知って」おり、優れたエラー処理を備えています。

ソースからビルドする場合、発生する可能性のある2つの一般的なタイプのエラーがあります。

  1. 構成スクリプト(通常はconfigまたはconfigureという名前)を実行して、セットアップに固有のメイクファイルを作成すると、構成エラーが発生します。
  2. makeコマンドを実行すると(メイクファイルが生成された後)コンパイラエラーが発生し、コンパイラは必要なコードを見つけることができません。

これらのそれぞれを見て、それらを解決する方法について説明します。

構成および構成エラー

ソースコードアーカイブファイルを抽出したら、ターミナルで、抽出したファイルを含むディレクトリに変更する必要があります。通常、このディレクトリ名はファイルの名前と同じです(.tar.gzまたは.tar.bz2拡張子なし)。ただし、ディレクトリ名は、バージョン情報のないアプリケーションの名前にすぎない場合があります。

ソースディレクトリで、READMEファイルまたはINSTALLファイル(あるいはその両方)を探します。通常、これらのファイルには、依存関係に関する情報など、アプリケーションのビルド/コンパイルおよびインストール方法に関する有用な情報が含まれています。「依存関係」は、正常にコンパイルするために必要な他のコンポーネントまたはライブラリの単なる名前です。

READMEand / or INSTALLファイルを読んだ後(そして、アプリケーションに関連するオンラインドキュメントを調べたら)、configまたはという名前の実行可能ファイル(ファイルに "x"権限が設定されている)を探しますconfigure。ファイルには.sh(などの)拡張子が付いている場合がありますconfig.sh。これは通常、他のユーティリティを実行して、コンパイルに「健全な」環境があることを確認するシェルスクリプトです。つまり、必要なものがすべてインストールされていることを確認します。

ヒント:これが設定ファイルではなくPythonベースのアプリケーションである場合、という名前のファイルを見つける必要がありますsetup.py。Pythonアプリケーションは通常、インストールが非常に簡単です。このアプリケーションをルートとしてインストールするには(たとえば、Ubuntuの下で次のコマンドの前にsudoを置きます)、このコマンドを実行します。

    $ python setup.py install

それがあなたがする必要があるすべてであるべきです。このチュートリアルの残りの部分をスキップして、アプリケーションの使用と使用に直接進むことができます。

ターミナルで構成スクリプトを実行します。通常、通常のユーザーアカウントで構成スクリプトを実行できます(実行すべきです!)。

$ ./config

スクリプトは、何をしているのかを知るためのメッセージを表示します。多くの場合、スクリプトは成功したか失敗したかを示し、失敗した場合は失敗の原因に関する情報を提供します。エラーメッセージが表示されない場合は、通常、すべてがうまくいったと想定できます。

構成スクリプトのように見えるスクリプトが見つからない場合、通常、アプリケーションは非常に単純なものであり、プラットフォームに依存しないことを意味します。つまり、提供さMakefileれているシステムはどのシステムでも動作するはずなので、以下のビルド/コンパイル手順に単純にスキップできます。

このチュートリアルでは、アプリケーションの構築時に発生する可能性のあるエラーの種類の例として、Newsbeuterと呼ばれるテキストベースのRSSリーダーを使用します。Newsbeuterの場合、構成スクリプトの名前はconfig.shです。システムで実行するconfig.shと、次のエラーが発生します。

tester@sitlabcpu22:~/download/newsbeuter-1.3$ ./config.sh
Checking for package sqlite3... not found

You need package sqlite3 in order to compile this program.
Please make sure it is installed.

いくつかの調査を行ったところ、実際にはsqlite3アプリケーションがインストールされていることがわかりました。ただし、ソースからビルドしようとしているので、これconfig.shは実際に探しているのはの開発ライブラリ(ヘッダー)であるというヒントですsqlite3。Ubuntuでは、ほとんどのパッケージには、で終わる開発対応パッケージが関連付けられています-dev。(Fedoraなどの他のプラットフォームでは、多くの場合-devel、開発パッケージにパッケージサフィックスを使用します。)

sqlite3開発パッケージに適切なパッケージを見つけるにはapt-cache、Ubuntu のユーティリティ(および同様yumにFedora のユーティリティ)を使用できます。

tester@sitlabcpu22:~/download/newsbeuter-1.3$ sudo apt-cache search sqlite

このコマンドは結果の非常に大きなリストを返すため、適切なパッケージがどれであるかを判断するために少しの探求作業を行う必要があります。この場合、適切なパッケージはになりますlibsqlite3-dev。探しているパッケージにはlib、同じパッケージ名plusの代わりにプレフィックスが付いている場合があることに注意してください-dev。これは、多くの異なるアプリケーションで使用される可能性のある共有ライブラリを探しているだけだからです。インストールするlibsqlite3-devには、ターミナルで典型的なapt-get installコマンドを実行します:

tester@sitlabcpu22:~/download/newsbeuter-1.3$ sudo apt-get install libsqlite3-dev

次に、config.shこの依存関係の問題を解決し、依存関係の問題がもうないことを確認するために、再度実行する必要があります。(Newsbeuterの場合、ここでは表示しませんが、libcurl4-openssl-devパッケージもインストールする必要がありました。)また、開発パッケージ(などlibsqlite3-dev)をインストールし、関連するアプリケーションパッケージ(たとえば)をインストールしsqlite3ない場合すでにインストールされている場合、ほとんどのシステムは関連するアプリケーションパッケージを同時に自動的にインストールします。

構成が正常に実行されると、結果として1つ以上のmakeファイルが作成されます。これらのファイルには通常、名前が付けられますMakefile(Unix / Linuxではファイル名の大文字と小文字が区別されることに注意してください)ビルドパッケージにsrcなどのサブディレクトリが含まれるMakefile場合、これらの各サブディレクトリにもが含まれます。

ビルドエラーとコンパイルエラー

これで、実際にアプリケーションをコンパイルする準備ができました。これはしばしば「建物」と呼ばれ、その名前は何かを構築する実際のプロセスから借用されています。通常は複数のソースコードファイルであるアプリケーションのさまざまな「部分」が組み合わされて、アプリケーション全体が形成されます。makeユーティリティは、ビルドプロセスを管理し、コンパイラやリンカーなどの他のアプリケーションを呼び出して、実際に作業を行います。ほとんどの場合、構成を実行したディレクトリからmake(通常のユーザーアカウントで)を実行するだけです。(Qtライブラリで書かれたアプリケーションのコンパイルなど、いくつかのケースでは、代わりにqmakeのような別の「ラッパー」アプリケーションを実行する必要があります。再び、READMEおよび/またはINSTALLドキュメントの詳細を常に確認してください。)

上記の構成スクリプトと同様に、ターミナルでmake(または同様のユーティリティ)を実行すると、実行中のものに関する警告メッセージと警告とエラーが表示されます。警告は主にアプリケーションの開発者向けであり、違反している標準的な慣行があることを伝えているため、通常は警告を無視できます。通常、これらの警告はアプリケーション機能には影響しません。一方、コンパイラエラーは処理する必要があります。Newsbeuterを使用してmakeを実行すると、しばらく問題はありませんでしたが、エラーが発生しました。

tester@sitlabcpu22:~/download/newsbeuter-1.3$ make
...
c++ -ggdb -I/sw/include -I./include -I./stfl -I./filter -I. -I./xmlrss -Wall -Wextra -DLOCALEDIR=\"/usr/local/share/locale\" -o src/configparser.o -c src/configparser.cpp
c++ -ggdb -I/sw/include -I./include -I./stfl -I./filter -I. -I./xmlrss -Wall -Wextra -DLOCALEDIR=\"/usr/local/share/locale\" -o src/colormanager.o -c src/colormanager.cpp
In file included from ./include/pb_view.h:5,
from src/colormanager.cpp:4:
./include/stflpp.h:5:18: error: stfl.h: No such file or directory
In file included from ./include/pb_view.h:5,
from src/colormanager.cpp:4:
./include/stflpp.h:33: error: ISO C++ forbids declaration of \u2018stfl_form\u2019 with no type
./include/stflpp.h:33: error: expected \u2018;\u2019 before \u2018*\u2019 token
./include/stflpp.h:34: error: ISO C++ forbids declaration of \u2018stfl_ipool\u2019 with no type
./include/stflpp.h:34: error: expected \u2018;\u2019 before \u2018*\u2019 token
make: *** [src/colormanager.o] Error 1

makeプロセスは、最初のエラーが発生するとすぐに停止します。コンパイラエラーの処理は、時には注意が必要な場合があります。問題に関するいくつかの手がかりを得るには、エラーを調べる必要があります。通常、問題は、通常拡張子が.hまたはのヘッダーファイル.hppが欠落していることです。上記のエラーの場合、問題はstfl.hヘッダーファイルが見つからないということです。この例が示すように、エラーメッセージの最初の行を見て、問題の根本的な原因を見つけるために下に向かって進みます。

Newsbeuterのドキュメント(開始する前に行うべきでしたが、チュートリアルのこの部分はあまり意味がありません!)を見て、STFLと呼ばれるサードパーティライブラリが必要であることがわかりました。それでは、この場合は何をしますか?基本的に、必要なライブラリに対してこのまったく同じプロセスを繰り返します。ライブラリを取得し、そのライブラリに対してconfigure-build-installプロセスを実行してから、目的のアプリケーションのビルドを再開します。たとえば、STFLの場合、libncursesw5-dev適切にビルドするにはパッケージをインストールする必要がありました。(通常、別の必要なアプリケーションをインストールした後、元のアプリケーションで構成手順をやり直す必要はありませんが、どちらも痛いことはありません。)

STFLツールキットを正常にインストールした後、Newsbeuterのmakeプロセスは正常に実行されました。通常、makeプロセスは、中断したところから(エラーの時点で)ピックアップします。したがって、すでに正常にコンパイルされたファイルは再コンパイルされません。すべてを再コンパイルする場合は、make clean allを実行してコンパイル済みのオブジェクトを削除してから、makeを再度実行します。

インストール中

ビルドプロセスが正常に完了したら、アプリケーションをインストールする準備が整います。ほとんどの場合、ファイルシステムの共通領域(/usr/binまたは/usr/share/bin、など)にアプリケーションをインストールするには、rootとしてインストールを実行する必要があります。インストールは、プロセス全体の中で最も簡単なステップです。インストールするには、ターミナルで次を実行します。

$ make install

このプロセスの出力でエラーを確認してください。すべてが成功した場合、ターミナルでコマンド名を実行でき、起動します。(GUIアプリケーションの場合は、コマンドラインの最後に&を追加します。そうしないと、アプリケーションの実行が完了するまでターミナルセッションを使用できなくなります。)

ソースからアプリケーションをビルドする場合、通常、UbuntuのGUIメニューにアイコンやショートカットは追加されません。これを手動で追加する必要があります。

そして、それは基本的に、Ubuntuのソースからアプリケーションをビルドおよびインストールするプロセスです(潜在的に反復的ですが)。これを数回行っただけで、2番目の性質になります!


ティム、私はあなたのチュートリアルを読みたいと思っていましたが、投稿したリンクは機能しません。
gareth_bowles

6

さて、。/ configure --helpは、GNU autotoolsが生成した構成ファイルについて、多くの情報を提供します。そのほとんどは、機能を有効にするために--with /-withoutになります(これらはライブラリを検索する場所を示す「共有」などの追加のパラメータを取る場合があります)。

他の重要なものは--prefix(デフォルトは/ usr / local /になります)をインストールする場所を指定します(パッケージをビルドする場合、通常は--prefix = / usrまたは--prefixとしてこれが必要です) = / opt / YourPackage)。

Linuxでは、/ lib、/ usr / lib、および/ usr / local / libが通常gccで検索され、ldconfigのデフォルト構成に含まれます。正当な理由がない限り、ここがライブラリの必要な場所です。ただし、/ etc / ld.so.confは追加のエントリをリストする場合があります。

「gcc -l」を実行してエラーが発生するかどうかを確認するだけで、それらを設定および検索できます。CFLAGSパラメーターに「-L」を追加して、検索にパスを追加できます。

複数のバージョンをインストールすることができ、古いバージョンにリンクされたソフトウェアはリンクされたままになります(Linuxでlddを実行してバインディングを確認します)が、通常、新しいコンパイルはシステム上の動的ライブラリの最新バージョンを対象としています。

ほとんどのソフトウェアは、特にlibtoolを使用する場合、動的ライブラリを想定しているため、重要なアプリが静的に正しくビルドされない場合があります。

ls -lは、インストールされているライブラリを見つける最善の方法です。

そして、それは私が情報が不足しているところです。パッケージでうまくプレイする方法:わからない。可能な場合は、問題を回避するために物事をパッケージにまとめます。


4

「どの引数を./configureに渡すかをどのように把握しますか?」

通常:./configure --helpは、そこに何が欲しいかを教えてくれます。

「インストールしたライブラリとバージョンを確認するにはどうすればよいですか?」

それはシステムに依存します。1つの方法はfind /|grep libname|less、通常、ライブラリファイルのファイル名にバージョンが含まれているためです。

「通常のシステムを壊さずにライブラリの複数のバージョンをインストールする方法はありますか?」

繰り返しますが、システムとライブラリに依存します。sudo make altinstallバージョン管理された名前が作成されます。ライブラリファイルは通常、それ自体をバージョン管理します。ただし、留意してください。バージョンはしばしば「正規化された」名前へのシンボリックリンクを作成するため、これは問題を引き起こす可能性があります。

「パッケージを使用して管理されているシステムにソースからものをインストールする場合、最もクリーンな方法は何ですか?」

./configureで--prefixパラメーターを使用し、どこかに配置することをお勧め/optします。

免責事項:私は決して専門家ではありませんが、cmd行(slackware、CentOS、redhat、ubuntu、その他、OS X)から5年以上Linuxを使用しています。


4

あなたの質問に少し答えるために、先日インストールしたライブラリとバージョンを確認する良い方法を見つけました(これはLinux Debian上にあるため、他のバージョンでも動作するはずです)。

dpkg --list

このような出力のある本当に長いリストを取得する必要があります

ii  libssl0.9.8    0.9.8c-4etch5  SSL shared libraries
ii  libssp0        4.1.1-21       GCC stack smashing protection library
ii  libstdc++5     3.3.6-15       The GNU Standard C++ Library v3
ii  libstdc++5-3.3 3.3.6-15       The GNU Standard C++ Library v3 (development
ii  libstdc++6     4.1.1-21       The GNU Standard C++ Library v3

4

サイモン、

1.)./configure --helpは、大量の情報を提供します。ぜひチェックしてみてください。通常、必要に応じて静的/動的にリンクされたライブラリをコンパイルするためのオプションがあります。

2.)ライブラリは動的リンカーパスに存在します。これは通常/etc/ld.so.confで設定されます。リンカは、最初に見つかったPATH環境変数に一致する適切なライブラリを検索します。

3.)ライブラリのバージョンが変更されたときにすべてを再コンパイルする必要があるため、一般的に問題が発生します。何らかの検索を行うと、おそらく静的リンクが悪い考えである理由がたくさん見つかるでしょう。私はここで詳しく説明することはできませんので、私は長い間それをやっていません。

4.)これは少し難しいです。ライブラリパスをチェックして、確実に確認する必要があります。通常、ライブラリには、インストールされているバージョンへのシンボリックリンクがあります。

例:libssh2.so.1-> libssh2.so.1.0.0

一般に、人々は自分のdebianパッケージを展開するか、他の手法を使用して、インストールするライブラリとプログラムを管理します。インストールしたソフトウェアはstow(http://www.gnu.org/software/stow/)を使用して管理します。これは非常に単純で、シンボリックリンクを使用してライブラリをインストールします。deb / rpmパッケージをビルド/インストール/テストする必要がないので、簡単だと感じています。

5.)ライブラリの複数のバージョンをライブラリディレクトリに通常どおりインストールできます。実行可能ファイルにリンクされたライブラリは、リンクされたバージョンにリンクされたままになります。実行可能ファイルでlddを実行すると、実行可能ファイルがリンクされているライブラリがわかります。

6.)前述したように、独自のdebianパッケージを展開するか、stowを使用することがおそらく最もクリーンなソリューションです。

7.)Mac OSXのことを本当に話すことはできませんが、Linuxの場合、ディストリビューションのパッケージングシステムが最善の方法です。

8.)lddを使用して、リンクされているバージョンや実行可能ファイルにリンクされているライブラリが見つからないことを見つけることで、おそらく多くのフラストレーションが解決されます。pkg-configは大いに役立ちますが、それを使用するソフトウェアについてのみです。最近は人気がありますが、デフォルトのautotoolsビルドシステムの一部ではありません。


4

静的ライブラリは良いアイデアではありません。ライブラリをアップグレードする必要がある場合(たとえば、セキュリティの問題を修正するため)、そのライブラリに依存するすべてのものを再コンパイルする必要があります。

「make install」がシステムを混乱させる可能性はありませんが、他の人が言ったように、通常は--prefixを使用して他の場所にインストールする代わりに/ usr / localにインストールすることで、痛みが大幅に軽減されます。そこで、/ usr / localを通常の(特権のない)ユーザーに変更しました。このようにして、「make install」は重要なシステムファイルを混乱させないことがほぼ保証されます。(これは明らかに、マルチユーザーシステムでは機能しません。ただし、仮想サーバーには最適です。)


4

質問のリストには明示的に記載されていませんでしたが、序文で言及しています。

./configure && make && sudo make install 通常は十分ですが、動作しない場合があります。動作しない場合、頻繁に行き詰まります。

DebianまたはUbuntuで立ち往生したら、auto-aptを使用します。これは、configureが見つけられないファイルを含むパッケージを自動的にインストールします。

見る:

便利な別のツールはCheckInstallです。インストールmake installされたパッケージのリストに、インストールされたアプリケーションを追加します:https : //help.ubuntu.com/community/CheckInstall


3

OS Xの場合:

  • ./configureに渡す引数を特定するにはどうすればよいですか?

./configure --help

  • 共有ライブラリと静的リンクライブラリの実際の違いは何ですか?なぜすべてを静的にリンクすることができず(RAMとディスクスペースは最近安い)、それゆえ奇妙なライブラリバージョンの競合を避けることができないのですか?

共有ライブラリを使用すると、それを使用するすべてを再コンパイルせずにライブラリをアップグレードできます。

  • 共有ライブラリがOS X / Linuxでどのように機能するか-ファイルシステム上の場所、。/ configure && makeがそれらを見つける方法、リンクされたときに実際に起こること

システムライブラリは/ usr / libにあります。

自分でコンパイルしたライブラリは/ usr / local / libにあります(/ usr / localは./configureのデフォルトの--prefixフラグです)。

環境変数DYLD_FALLBACK_LIBRARY_PATHおよびLD_LIBRARY_PATHを使用して、検索するフォルダーを指定できるため、リストの先頭に/ usr / local / libが存在する必要があります。

  • 通常のシステムを壊さずに、ライブラリの複数のバージョンをインストールする方法を教えてください。

すべてを/ usr / localにインストールします-上記の環境変数を使用すると、/ usr / local / libのバージョンが環境の/ usr / libのバージョンより優先されます。

  • パッケージを使用して管理されているシステムにソースからのものをインストールする場合、最もクリーンな方法は何ですか?

/ usr / localにインストールします。Ubuntuでは、最初にcheckinstallを使用して、debパッケージを作成します。

  • なんとかソースから何かをコンパイルすることができたと仮定すると、それを他の人が同じフープを飛び越える必要がないようにパッケージ化するにはどうすればよいですか?特にOS Xでは...

コンパイル手順をブログ記事に文書化してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.