12

ファイルpila.hpila.c. pila.cファイルをコンパイルするとgcc pila.c -c、このライブラリは正常に動作します。私はそれをテストしました。

次に、別のライブラリを作成しました。このライブラリには、ファイルpila_funciones_extra.hpila_funciones_extra.c. このライブラリには、最初のライブラリを含める必要があります。ファイルpila_funciones_extra.hに次の行を入れて、それを含めます。

#include "pila.h"

そしてファイルpila_funciones_extra.cに次の行を入れます:

#include "pila_funciones_extra.h"

それがなければならないので。

しかし、ファイルをコンパイルしようとするとpila_funciones_extra.c、コンパイラはライブラリのインクルードを認識しませんpila。ライブラリで定義されている関数、構造体、定数、およびマクロが定義されpilaていないことを示しています。

gcc pila_funciones_extra.c -cand でコンパイルしようとしましgcc pila_funciones_extra.c -c pila.oたが、うまくいきません。

すべてのファイルが同じフォルダーにあることを確認しました。

私はUbuntuに取り組んでいます。

誰かがそれをコンパイルする正しい方法を教えてもらえますか?

4

2 に答える 2

26

まず、常に;オプションを使用してコンパイルする-Wall(そしておそらくさらに多くの警告を取得する) 習慣を身に付けてください。 ほとんどすべての警告が表示されるため、警告が表示されなくなるまでコードを改善する必要があります。-Wextragcc

次に、コードをデバッグできるようにしたい場合が多いので、 にも渡し-gますgcc。コードに自信が持てたらgcc、最適化されたマシン コードの生成を-O2. gdbデバッガーの使い方を学びます。

したがって、ソースファイルがディレクトリにあるfirst1.cと仮定して、最初のライブラリをコンパイルします。first2.cFirstLib/

cd FirstLib/
gcc -Wall -g -c first1.c -o first1.o
gcc -Wall -g -c first2.c -o first2.o

この時点で、特に を取得したいので、Makefileを使用し、 の使用方法を学ぶ必要があります。makelibfirst.a

ar ruv libfirst.a first1.o first2.o
ranlib libfirst.a

次に、コマンドを使用してプログラムをコンパイルおよびリンクするコマンド-L../FirstLib -lfirstに最後のオプションとして渡すことができます。gcclibfirst.a

次に、おそらく含まれているはずのMakefilein ディレクトリを使用して、2番目のライブラリをコンパイルしますSecondLib/

# in SecondLib/Makefile
CC=gcc
CFLAGS= -I../FirstLib/ -Wall -g
## add your other stuff for make

makeなどなど。あなたは本当に独自の-s の使い方と書き方を学びたいので、時間をかけてGNU make documentationMakefileを読んでください。

に渡し-Hgcc、含まれているすべてのファイルを教えてもらいたい場合があります。また、より複雑な-s をデバッグするために (特に を実行して) remake ( に加えて & の置換 ) を使用することもできます。の例を次に示します。他にもたくさんあります!makeMakefileremake -xMakefile

Program Library Howtoもお読みください。

于 2013-02-17T12:15:13.470 に答える
2

多くのファイルで構成されるライブラリの場合、最初にコンパイルしてから個別に実行してから、次のようにします。

ar ruv mylib.a pila_funciones_extra.o pila.o
ranlib mylib.a

このコマンドにより、ライブラリがまだ存在しない場合に作成されます。存在する場合、.o ファイルが更新 (またはこのライブラリに追加) されます。ranlibは、ローダーに役立つ方法でライブラリをランダム化するために使用されます。

このライブラリを使用するときは、次のことを行います。

gcc -o myapp myapp.c mylib.a
于 2013-02-17T10:47:20.967 に答える