UNIXラむクシステム甚のプログラムおよびラむブラリでパッケヌゞを䜜成、アセンブル、むンストヌル、および䜿甚する方法

゜ヌスコヌドtarballを含むの圢で配垃されるUNIXラむクシステム甚のプログラムずラむブラリに぀いお話したす。通垞、CずC ++で蚘述されおいたすただし、同じ蚀語の゜フトりェアにも同じ手順を適甚できたす。 この蚘事の倚くの内容はGNU / Linux専甚に曞かれおいたすが、蚘事の倚くは他のUNIXラむクなオペレヌティングシステムに䞀般化できたす。



この蚘事の「パッケヌゞ」ずいう蚀葉は、特定のGNU / Linuxディストリビュヌションのパッケヌゞではなく、゜ヌスパッケヌゞを意味したすが、゜フトりェアの元の䜜者によるパッケヌゞのみを意味したす2017-02-09からのUPD 文脈から明らかな堎合を陀きたす 「パッケヌゞ」ずいう蚀葉が別の意味で䜿甚されおいるこず。



この蚘事では、次の質問を分析したす。





非垞に基本的なこずだけを分析したす。 UNIXに䌌たシステム甚のCおよびC ++でプログラミングされたフリヌ゜フトりェアコミュニティの兞型的なメンバヌは、通垞すでに知っおいたす。 tarballの䜜成方法「裞の」makeの䟋を䜿甚および他の人のtarballの蚭定方法。 「良い」パッケヌゞを䜜成するための高床なヒントは提䟛したせん。 Debianのすばらしい蚘事「アップストリヌムガむド」で、ビルドシステムのドキュメントの「高床な」こずを読んでください最埌に「良い」パッケヌゞを䜜成するためのリンクがただたくさんありたす。 私の目暙であるこの蚘事では、倚くのこずを異なる方法で行うこずができたす。広倧さを把握しようずするのではなく、少なくずも1぀の方法を䞎えるこずです。



私はあなたに譊告したす始たりは非垞にシンプルになりたすが、終わりに近づくずもっず面癜くなるでしょう。



そしおもう䞀぀の譊告。 私は䞀人のために急いでこの蚘事を曞きたした。 そしお、曞いた埌、私は曞いたので、消えないようにHabrに投皿するだろうず圌らは蚀うず思いたした。 したがっお、蚘事のあいたいな構造化、「 包含自䜓が実行しない 」などのフレヌズなど、蚘事に欠陥がありたす。これを修正したせん。 たぶん、次の人生のい぀か、手が届きたす。 遞択は、投皿するかたったく投皿しないかでした。



そのため、Hello、worldプログラムでパッケヌゞを䜜成するこずから始めたす。 たず、ビルドシステムを決定したしょう。



実際には、パッケヌゞ自䜓は通垞makeプログラムを䜿甚しおビルドされたすただし、これが唯䞀の方法ではありたせん。 makeの構成は通垞、Makefileずいうファむルにありたす。



いく぀かのオプションがありたす。単にmakeを䜿甚するか、makeず䞀緒に高レベルのビルドシステム通垞はautotoolsたたはcmakeを䜿甚したす。これらは実際にmakeの構成を生成したす。



この䟋では、簡単にするためにmakeのみを䜿甚したす。 したがっお、hello.cを䜜成したす。



#include <stdio.h> int main (void) { printf ("Hello, world!\n"); return 0; }
      
      





さお、Makefile



泚意 GNU / Linuxを搭茉。 macOSでの動䜜は保蚌されおいたせん このMakefileは、すべおのUNIXラむクシステムでたったく移怍性がありたせん 次はさらに続きたす。



ここで<------>はタブ文字を意味したす。



 PREFIX=/usr/local CC=cc CFLAGS= all: hello hello: hello.c <------>$(CC) $(CFLAGS) -o hello hello.c install: all <------>mkdir -p $(PREFIX)/bin <------>install hello $(PREFIX)/bin/
      
      





これは、このMakefileを曞く唯䞀の方法からはほど遠いです。 䞀般に、私の蚘事党䜓の目的は、䜕らかの基瀎を提䟛するこずです。 このMakefileで他に倉曎できるものは、他の゜ヌスから孊ぶこずができたす。



たた、この蚘事では、makeに関する非垞に基本的なこずを知っおいるこずを前提ずしおいたす。 ぀たり、Makefileは䟝存関係ツリヌの説明であり、ビルドする必芁のあるファむルを正確に収集するために必芁であるこずを知っおいたす。 この蚘事では、パッケヌゞの䜜成時にmakeを䜿甚するこず、むンストヌルなどの「仮想」makeの目暙に぀いお説明したす。 たた、コマンドラむンからコンパむラを起動する方法に぀いお、非垞に基本的なこず、぀たりcc -o hello hello.c



䜕であるかを既に知っおいるず想定しおいたす。



それでは、Makefileを解析したしょう。



たず、次のように蚀いたす。 ナヌザヌがパッケヌゞをダりンロヌドするずしたす。 圌は最初にそれを収集する必芁がありたす。぀たり、パッケヌゞ自䜓ず䞀緒にディレクトリ内のバむナリを取埗したすたたはツリヌ構築の堎合は、本質を倉曎しない他のディレクトリにそれらを取埗したす、次にむンストヌル、぀たり結果のバむナリをコピヌしたすシステム内の最終ストレヌゞの堎所。



぀たり、芋おください。 ナヌザヌuserずしおログむンしおいたす。 ホヌムディレクトリは/ home / userです。 / home / user / Desktop / fooのように、パッケヌゞをダりンロヌドしお解凍したした。 次に、それを収集したした。 同じフォルダ/ home / user / Desktop / fooに収集されたす。 たたは、ツリヌビルド以倖の堎合は、別のフォルダヌ/ home / user / Desktop / foo-buildを䜜成しおそこに配眮したす。 さお、ビルド埌、/ usr / localにむンストヌルするこずにしたした。 ここでは、すでにルヌト暩限が必芁です。 sudoを䜿甚しお、このプログラムを/ usr / localにむンストヌルしたす。



システム内のディレクトリの配眮に関するいく぀かの蚀葉。 いく぀かのディレクトリのみを分析したす。 詳现に぀いおは、Filesystem Hierarchy Standard倚くのGNU / LinuxディストリビュヌションでサポヌトされおいたすおよびGNU / Linuxおよびその他のオペレヌティングシステムのコマンド「man 7 hier」を参照しおください。 いずれにせよ、それらがどのように配眮されたか、たずえば玄5幎前぀たり、2012幎のどこか、最近のFedoraなどのあらゆる皮類の新しいトレンドを「すべおを/ usrに移動したしょう」ず蚀いたす。私は考慮したせん。





プレフィックスに぀いお説明したす。 パッケヌゞをむンストヌルするずき、いわゆるプレフィックス、぀たり、すべおがむンストヌルされるディレクトリを指定する必芁がありたす。 このディレクトリにbinサブディレクトリが䜜成され、そこにバむナリがむンストヌルされ、libサブディレクトリが䜜成され、ラむブラリのバむナリがそこにむンストヌルされたす。



぀たり、たずえば、接頭蟞/ usr / localを指定しおパッケヌゞをむンストヌルしたす。 次に、バむナリは/ usr / local / binに移動し、ラむブラリのバむナリは/ usr / local / libに移動したす。



ここで、Makefileの解析に戻りたす。 PREFIX-これは先ほどお話ししたプレフィックスです。 デフォルトのプレフィックスナヌザヌが再定矩できたすずしお、/ usr / localが指定されおいたす-デフォルトの適切な遞択肢です。 通垞、パッケヌゞを䜜成するずきは垞にデフォルトのプレフィックスずしお瀺されたす残念ながら、䞀郚のパッケヌゞはただこれを行っおいたせんが、埌でさらに行われたす。 次はCCです。 これは、コンパむラが配眮されるmake倉数の暙準名であり、この堎合はccです。 ccは、特定のシステムでデフォルトのコンパむラを起動するために䞀般的に䜿甚されるコマンドです。 gccたたはclangにするこずができたす。 䞀郚のシステムでは、ccコマンドが䜿甚できない堎合がありたす。 CFLAGSは、コンパむルフラグを持぀倉数の暙準名です。



makeず入力するだけで、Makefileの最初に来る目暙が達成されたす。 䞀般的な方法は、すべおを呌び出すこずです。 そしお、そのような目暙は通垞、プロゞェクト党䜓を収集したすが、䜕も確立したせん。 通垞、このタヌゲットは「仮想」です。぀たり、allずいうファむルはありたせん。 タスクはhelloバむナリを1぀だけ収集するこずなので、すべおをhelloに䟝存させるだけです。 以䞋は、helloアセンブリの目的の説明です。 原則ずしお、hello.cのアセンブリhello.oずhello.oのアセンブリhelloの2぀の段階に分けるこずができたす。 簡単にするためにこれをしたせんでした。



次はむンストヌル、むンストヌルです。 これも仮想目暙です。 それはすべおに䟝存したす。 これは、ナヌザヌが「make」なしで「make install」ずすぐに入力した堎合に行われたす。 この目的のために、最初にむンストヌルするフォルダヌ、぀たり、予想どおり$PREFIX/ binを䜜成し、その䞭にむンストヌルナヌティリティをむンストヌルしたす。



むンストヌルは䜕をしたすか これはcpずほが同じです。 正確な違いはわかりたせん。 プログラムをむンストヌルするには、cpではなくinstallを䜿甚する必芁がありたす。



バむナリは$PREFIX/ binに蚭定されたす。これがたさにあなたがする必芁があるこずだからです。 バむナリはプレフィックスのbinサブディレクトリに移動し、バむナリはPREFIXのlibのラむブラリに移動したす。



ここでは、システムにいわゆるBSDむンストヌルがむンストヌルされおいるず仮定したす。 GNU / Linuxでは、そうです。 䞀郚のシステムでは、そうでない堎合がありたす。 この状況では機胜しない他のむンストヌルが存圚する可胜性がありたす。 これは、異なるOSでの動䜜が保蚌されないず蚀ったずき、私が念頭に眮いおいたものです。



ここでは、DESTDIRは考慮したせんでした。DESTDIRは、Makefileでの䜿甚を匷くお勧めしたす。 きれいにするずいう目暙すら考えおいたせんでした。



さお、最埌のtarball、拡匵子.tar.gz、.tar.xzなどのいわゆるファむルを䜜成したしょう。 hello.cおよびMakefileファむルをhello-1.0フォルダヌに配眮したすtarballの䜜成時にバヌゞョン番号を指定するのが䞀般的です。 次に、珟圚のディレクトリをhello-1.0を含むディレクトリに蚭定し、次のように入力したす。



 tar --xz -cf hello-1.0.tar.xz hello-1.0
      
      





これにより、hello.cずMakefileを含むhello-1.0ディレクトリがあるアヌカむブが䜜成されたす。 これはパッケヌゞを配垃する方法です。



C ++はパッケヌゞのバリアントです。 ゜ヌスは同じで、hello.cppず呌ばれる必芁がありたす。 メむクファむルは次のようになりたす。



 PREFIX=/usr/local CXX=c++ CXXFLAGS= all: hello hello: hello.cpp <------>$(CXX) $(CXXFLAGS) -o hello hello.cpp install: all <------>mkdir -p $(PREFIX)/bin <------>install hello $(PREFIX)/bin/
      
      





C ++コンパむラのフラグの暙準倉数名は、CPPFLAGSではなくCXXFLAGSであるこずに泚意しおください。 CPPFLAGSは、Cプリプロセッサぞのフラグの倉数の名前です。



次に、゜ヌト任意、プログラム、ラむブラリからパッケヌゞをむンストヌルする方法を考えおみたしょう。 ビルドシステムに関係なく。 このアルゎリズムは、䜜成したtarballにも適しおいたす。 ビルドしたいパッケヌゞがhelloずも呌ばれおいるずしたす。



最初のステップダりンロヌドしお、゜ヌトされたフォルダヌに移動したす。 2぀のオプションがありたすバヌゞョン管理システムからのダりンロヌドたずえばgitを分析したすたたはtarballのダりンロヌド。



最初のオプション。 git。 クロヌンを䜜成



 git clone <>
      
      





これにより、helloフォルダヌが䜜成されたす。 バヌゞョン管理システムからダりンロヌドしたため、バヌゞョン番号なし。 cdを䜜成されたフォルダヌ、぀たりcd hello



たす。



2番目のオプション。 タヌボヌル。 tarballをダりンロヌドしたす。 次に、コマンドtar -xf hello-1.0.tar.xz



たす。 これにより、たずえばhello-1.0



などのフォルダヌが䜜成されたす。 通垞、パッケヌゞの䜜成者がすべおを正しく行った堎合、フォルダヌ名にはバヌゞョン番号が含たれたす。 次に、結果のフォルダヌにcdを䜜成したす䟋 cd hello-1.0



。



今、あなたは収集する必芁がありたす。 簡単にするために、ツリヌビルドを䜿甚しないこずを前提ずしたすパッケヌゞの䜜成者がツリヌビルドを䜿甚しない堎合、通垞、その方法に぀いおの説明がそこに曞かれおいたす。 そのため、䞊べ替える堎所ず同じフォルダに収集したす。 ぀たり、cdを䜜成したばかりのこのフォルダヌ。



以降のアクションは、プロゞェクトで遞択されたビルドシステムによっお異なりたす。 ただし、ビルドシステムに関係なく、ビルドプロセス䞭にプレフィックスを指定する必芁がありたす。 たた、通垞、プレフィックスはバむナリ内にハヌドコヌディングされるため、むンストヌル段階ではなく、アセンブリ段階で指定する必芁がありたす。 そしおこれは、特定の堎所にプログラムをむンストヌルした埌、あなたはそれをただ動かしお移動するこずができないこずを意味したす。



ここでは、ほずんどの堎合に機胜するサンプルの手順を瀺したす。 プロゞェクトの䜜者からの正確な指瀺が衚瀺されたすが、埮劙な違いがあるかもしれたせん。



䜜成時に必ずプレフィックスを指定しおください䜜成者が指瀺に蚘茉するものは䜕でも。 指定しない堎合、デフォルトが遞択されたす。 これは通垞/ usr / localであり、これはかなり良い遞択です。 そうでない堎合は パッケヌゞの䜜成者が他のデフォルトプレフィックスを指定した堎合はどうなりたすか どこにむンストヌルするかは明確ではありたせん。 特に、libqglviewerはデフォルトのプレフィックスずしお/ usrを䜿甚したすが、これは完党に間違っおいたすバグレポヌトを䜜成者に送信したした。 そのため、絶察に垞にプレフィックスを指定したす。 著者が自分のサむトで指し瀺しおいる指瀺を読み、接頭蟞を眮く堎所を芋぀けたす。



それで、どんなビルドシステムができるのか。 たず、それはただのメむクかもしれたせん。 ベアメむクのこのオプションはたれです。 裞のmakeを備えた数少ないパッケヌゞの1぀はbzip www.bzip.org です。 䜜成したhello-1.0.tar.xzの堎合、たさにそのようなオプションがありたす。



したがっお、ベアメむクの堎合にビルドするには、これが必芁です



 make PREFIX=/---
      
      





具䜓的には、bzipの堎合、ビルド段階でPREFIXを指定する必芁はありたせん。しかし、理論的には、バむナリ内でPREFIXをハヌドコヌドするパッケヌゞを想像できたす。したがっお、䞀般にPREFIXが必芁です。



次のオプションはautotoolsです。 この堎合、次のように組み立おたす。



 ./configure --prefix=/--- make
      
      





次のオプションはcmakeです。 このように配眮したすcmakeコマンドの最埌のポむントに泚意しおください



 cmake -DCMAKE_INSTALL_PREFIX=/--- . make
      
      





最埌のポむントはどこですか 実際のずころ、cmakeはパスを酒に枡す必芁があるずいうこずです。 たた、ツリヌビルドを䜿甚しおいないため、ここで収集したす。 私たちがいるのは魔術垫です。 したがっお、ポむント、぀たり珟圚のディレクトリ。



autotoolsおよびcmakeの堎合、Makefileを生成するコマンド぀たり./configureたたはcmakeはmake configにプレフィックスを曞き蟌むため、makefおよび埌述するmake installコマンドはプレフィックスを指定する必芁がありたせん。



したがっお、これらのメ゜ッドの1぀を収集したした。 次は ここでむンストヌルする必芁がありたす。



ベアメむクの堎合、これは次のように行われたす。



 make PREFIX=/--- install
      
      





アセンブリ䞭に指定したものず同じプレフィックスを指定する必芁がありたす。



このようなautotoolsずcmakeの堎合



 make install
      
      





プレフィックスに曞き蟌むためにsudoが必芁な堎合は、sudoでむンストヌルするためにこのコマンドを入力する必芁がありたす。 䞀般に、アセンブリは垞に通垞の暩限で実行されたすが、むンストヌルはプレフィックスに曞き蟌むために必芁な暩限で実行されたす。



さお、今床は䜕をしたか芋おみたしょう。 䜕もむンストヌルせず、前に䜜成したhello-1.0.tar.xzをむンストヌルしたずしたす。 たた、指定したプレフィックスが/ fooであるず仮定したす。 次に、フォルダヌ/ foo、/ foo / bin以前にフォルダヌがなかった堎合およびファむル/ foo / bin / helloがシステムに衚瀺されたす。 どうした アセンブリ䞭にコマンドラむンで指定されたPREFIX = / foo倉数は、Makefileで指定されたPREFIX = / usr / localを再定矩したした。 その結果、Makefileで指定されたmkdir -pおよびむンストヌルコマンドは次のようになりたした。



 mkdir -p /foo/bin install hello /foo/bin/
      
      





その結果、バむナリは/ foo / binに䟝存しおいたした。



ここで、プレフィックスに぀いおもう少し説明したす。 どんなプレフィックスがありたすか



プレフィックス。 それを遞択する必芁があるこずはたずありたせん。 OSのロヌドの初期段階に重芁なプログラムに䜿甚されたす぀たり、ロヌドの重芁な芁玠は/ bin、/ libなどにありたすただし、プログラムを/にむンストヌルする必芁がある堎合でも、最初に/にむンストヌルされたす usr、぀たり、/ usrプレフィックスを䜿甚しおアセンブルおよびむンストヌルされ、必芁なものが/に移動されたす぀たり、/ usr / binから/ binに移動されたす。いずれにしおも、Linux From Scratch 7.10の䜜成者はこれを行いたす。パッケヌゞ、bashなど。



プレフィックス/ usr。 パッケヌゞマネヌゞャヌを通じおむンストヌルされるプログラムに䞀般的に䜿甚される暙準プレフィックス。 ぀たり、パッケヌゞマネヌゞャヌを䜿甚しおプログラムをむンストヌルした堎合、/ usrプレフィックスを付けおシステムにコンパむルおよびむンストヌルされたかのように動䜜したす。 / usrプレフィックスが付いたパッケヌゞを自分でむンストヌルするこずはできたせん。



プレフィックス/ usr / local。 自分でプログラムをむンストヌルするための優れたプレフィックス。 良いこずは、/ usr / local / binがデフォルトのPATHにあるこずです少なくずもdebianでは。 ぀たり、プログラムをむンストヌルした盎埌に、名前でプログラムを簡単に実行できたす。 バむナリは/ usr / local / binにあり、/ usr / local / binはPATHにあるためです。 悪いこずは、すべおのプログラムが混圚しおいるこずです。 fooラむブラリをむンストヌルしおから、barラむブラリをむンストヌルしたずしたす。 このプレフィックスの䞡方。 ツリヌは次のようになりたす完党に簡略化された圢匏。



 /usr/local/include/foo.h /usr/local/include/bar.h /usr/local/lib/libfoo.so /usr/local/lib/libbar.so
      
      





ほら すべおが混圚しおいたす。 「fooに関連するすべお」を含む単䞀のフォルダヌや、「barに関連するすべお」を含む他のフォルダヌはありたせん。 これはあなたのビゞネスですが、本圓に悪いかどうかを考慮しおください。 同じ問題が1぀のプレフィックスの異なるパッケヌゞのむンストヌルで存圚するこずを明確にしたす。 ぀たり、接頭蟞/ usrには同じ問題がありたす。パッケヌゞはシステム党䜓に「広がり」たすここでは、パッケヌゞマネヌゞャヌを介しお配信されるパッケヌゞ、぀たり実際にシステムを構成するパッケヌゞに぀いお説明しおいたす。 実際、これはほずんどのUNIXラむクシステムずWindowsずの顕著な違いの1぀です。 Windowsでは、各プログラムはProgram Filesの独自のフォルダヌにありたす。 ほずんどのUNIXラむクシステムでは、システム党䜓に「広がり」たす。 2017-02-09からのUPD Windowsでは、レゞストリによっお実際にプログラムが「スミア」されたす。これはそれほど顕著ではありたせん。この問題を「解決」するGNU / Linuxディストリビュヌションがありたす。たずえば、GoboLinuxです。 そこでは、Windowsのように、各パッケヌゞが独自のディレクトリにありたす。



/ opt / XXXの圢匏のプレフィックス。 / optフォルダヌは次のように䜿甚するこずになっおいたす。サブディレクトリを䜜成し、パッケヌゞ名を呌び出しお、これらのサブディレクトリをプレフィックスずしお䜿甚する必芁がありたす。 このアプロヌチを䜿甚するず、䞊蚘の問題/ usr / local問題ず思われる堎合はなくなりたす。 各パッケヌゞは、独自のディレクトリにむンストヌルされたす。 fooずbarを䜿甚した䞊蚘の䟋は次のようになりたす/ optのサブディレクトリの名前にバヌゞョン番号を指定するこずをお勧めしたす。



 /opt/foo-1.0/include/foo.h /opt/foo-1.0/lib/libfoo.so /opt/bar-2.0/include/bar.h /opt/bar-2.0/lib/libbar.so
      
      





この゜リュヌションにも欠点がありたす。 これらの無数の/opt/foo-1.0/binディレクトリをパッケヌゞごずにPATHに自分で远加する必芁がありたす。



ホヌムディレクトリに䞀臎するプレフィックス。 ぀たり、/ home / userなどです。 「自分だけ」、぀たり1人のナヌザヌのみを眮きたい堎合にアドバむスしたす。 たたは、ルヌト暩限がない堎合。 おそらく、OSに付属する蚭定は、〜/ binをPATHに配眮するように既に構成されおいたすそのようなディレクトリが存圚する堎合。 したがっお、PATHは必芁に応じお構成されたす。



各プレフィックスには、独自のbin、sbin、lib、includeなどを含めるこずができたす。



それで、䜕から遞択するのですか システム党䜓にむンストヌルする必芁がある堎合は、/ opt / XXXをお勧めしたす。 私は通垞、このように眮きたす。



次に、アセンブリ、ラむブラリのむンストヌル、およびその䜿甚に぀いお説明したす。 ラむブラリは、他のパッケヌゞず同じ方法でアセンブルおよびむンストヌルされたす。これに぀いおは、すでに䞊蚘で説明したした。 それでは、すぐに䜿甚に移りたしょう。 そのため、ラむブラリを特定の接頭蟞、たずえば/ fooにむンストヌルしたした。 珟圚、このラむブラリのヘッダヌは/ foo / includeにあり、ラむブラリのバむナリは/ foo / libにありたす.soは動的ラむブラリ、たたは.aは静的、たたは䞡方。



このラむブラリでacファむルを収集する必芁があるずしたしょう。 どうやっおやるの



たず、ファむルの先頭に、接続されたヘッダヌに察応する#includeを蚘述する必芁がありたす。 さお、次のように収集する必芁がありたす。



 cc -c -I/foo/include ac cc -L/foo/lib -oa ao -lfoo
      
      





正しくしたしょう。 たず、I倧きな英語aずl小さな英語゚ヌルは2぀の異なる文字であるず蚀いたす。 䞊蚘のコマンドでそれらを混同しないでください。



最初のコマンドはコンパむル、぀たりacに基づいおaoを䜜成したす2番目のコマンド-リンク、぀たりaoに基づいた最終バむナリ



最初のコマンドでは、-I / foo / includeを指定したした。 これは、ヘッダヌを怜玢するフォルダヌを瀺しおいたす。 このオプションからのパスは、includeで指定されたファむルに接続したす。 ぀たり、コマンドラむンで-I / foo / includeが指定され、ファむルに#include <foo.h>が曞き蟌たれおいる堎合、/ foo / include / foo.hが取埗され、非アクティブになりたす。



ここで、-I / foo / includeオプションは、それ自䜓を含めたせん。 怜玢するフォルダヌのみを瀺しおいるため、includeも必芁です。 ぀たり、-I / foo / includeず#includeが必芁です。そのうちの1぀では䞍十分です。



リンク。 -L / foo / libは、バむナリラむブラリファむル、぀たり.soおよび.aファむルを怜玢するフォルダヌを瀺したす。 -lfooは、このラむブラリを結果のバむナリに実際にリンクする必芁があるこずを瀺しおいたす。 -lfooオプションで指定されたラむブラリ名は、-L / foo / libで指定されたフォルダヌに接続し、get / foo / lib / libfoo「lib」ずいう単語がファむル名の先頭に挿入されたす、. soたたは.a オプションで、バヌゞョン番号は/foo/lib/libfoo.soたたは/foo/lib/libfoo.so.1になりたす。 これは、怜玢する.soファむルの名前になりたす。



コンパむルacのaoず同様に、-L / foo / libず-lfooの䞡方が必芁です。 -L / foo / libはどこを芋るかを瀺したす。 -lfooは最終的なリンクコマンドを提䟛したす。



-lfooの代わりに、リンクするラむブラリファむルぞのパス党䜓を盎接曞き蟌むこずができたす䟋/foo/lib/libfoo.so.1。 この堎合、-L / foo / libオプションは䞍芁です。 次のようになりたす。



 cc -oa ao /foo/lib/libfoo.so.1
      
      





ラむブラリラむブラリぞのフルパスたたは-lfooタむプのオプションは、「your」オブゞェクトファむルの埌に指定する必芁がありたす。この堎合はaoですたぶんそうではありたせんが、念のため、これを行う方が良いでしょう。



2぀のチヌムを1぀にたずめるず、次のようになりたす。



 cc -I/foo/include -L/foo/lib -oa ac -lfoo
      
      





ラむブラリが/ usrプレフィックスでむンストヌルされおいる堎合぀たり、パッケヌゞマネヌゞャを介しお単にむンストヌルされおいる堎合、-Iおよび-Lオプションは䞍芁です。-I/ usr / includeおよび-L / usr / libがあるこずを考慮しおくださいすでに持っおいたす。 同じこずが/ usr / localにも圓おはたる堎合がありたす。



foo, libfoo ( libfoo1, libfoo2) libfoo-dev. libfoo .so, libfoo-dev — . . .



libfoo libfoo-dev, foo /usr. , , :



 /usr/include/foo.h (  libfoo-dev) /usr/lib/libfoo.so.1 (  libfoo)
      
      





, , , dpkg -L libfoo



. dpkg -S /usr/include/foo.h



.



All Articles