質問
んに問題私のコンパイラ聞かせていただきましてある"未定義への参照"の機能を使いたいのは、図書館があります。私の一部の情報の問題:
- 私のクロス集計gcc for C.
- 私を呼び出す図書館の機能を通じてアクセスが含まれるヘッダを含む他のヘッダを含む試作品です。
- 付属のヘッダのディレクトリを使用していること。
- 私が最初に作ります。oファイルをリンクしてコマンドです。
その後、私の考えですが、私のライブラリファイルもお使いいただくことによっては、正しい方法です。私を含めることにヘッダのフォルダの前後できます。oファイルです。
あがらせる可能性もありますか、どのようなリンカーはそのこと。
よろしく!
対応答
- らりすまでお越しください。図書館でのファイル一本で行けます。hます。cは、図書室、-lな適切な
- 私の理解のライブラリファイルでは、収集のヘッダおよびソースファイルがかもしれないが集ます。oファイルを作成したソースから?!
- ありません図書館のオブジェクトファイルを作成し、ん、ありがとうございまは??ありそうかわからないの違いを含め、図書館ゃを作る:-)
全体的に対応!についてたくさんのことを学びます。いすべての対応として受け答え:-)
解決
.oファイルを生成するためにライブラリ内の.cファイルをコンパイルしていないようです。リンカは、ライブラリのコンパイルによって生成された.oファイルでプロトタイプの実装を探します
ビルドプロセスはライブラリの.cファイルをコンパイルしますか?
「ライブラリ」と呼ぶ理由それが実際に単なるソースコードであるなら?
他のヒント
ヘッダーは、関数宣言と関数定義を提供します。リンカが関数の実装を見つける(および未定義の参照を取り除く)ようにするには、-lフラグを使用して、関数が存在する特定のライブラリをリンクするようにコンパイラドライバ(gcc)に依頼する必要があります。たとえば、-lmは数学ライブラリをリンクします。通常、関数のマニュアルページは、関数を見つけるために指定する必要があるライブラリがある場合、そのライブラリを指定します。
リンカーが指定されたライブラリを見つけることができない場合、-Lスイッチを使用してライブラリ検索パスを追加できます(たとえば、-L / usr / local / lib)。 LIBRARY_PATH環境変数を使用して、ライブラリパスに永続的に影響を与えることもできます。
問題のデバッグに役立つ追加の詳細を次に示します。慣例により、ライブラリファイルの名前にはlibが接頭辞として付けられ(静的形式で).a拡張子が付けられます。したがって、システムのデフォルトの数学ライブラリ(-lmでリンクするもの)の静的にリンクされたバージョンは、通常/usr/lib/libm.aにあります。特定のライブラリで定義されているシンボルを確認するには、ライブラリファイルでnm --defined-onlyを実行します。私のシステムでは、libm.aでコマンドを実行すると、次のような出力が表示されます。
e_atan2.o:
00000000 T atan2
e_asinf.o:
00000000 T asinf
e_asin.o:
00000000 T asin
コンパイラが使用するライブラリパスと、デフォルトでロードするライブラリを確認するには、-vオプションを指定してgccを呼び出します。再度私のシステムでこれは次の出力を与えます。
GNU assembler version 2.15 [FreeBSD] 2004-05-23 (i386-obrien-freebsd)
using BFD version 2.15 [FreeBSD] 2004-05-23
/usr/bin/ld -V -dynamic-linker /libexec/ld-elf.so.1 /usr/lib/crt1.o
/usr/lib/crti.o /usr/lib/crtbegin.o -L/usr/lib /var/tmp//ccIxJczl.o -lgcc -lc
-lgcc /usr/lib/crtend.o /usr/lib/crtn.o
私は恐れおの図書館とヘッダーな概念です。いて図書館 libmylib.a
が含まれる機能 myfunc()
および対応するヘッダー mylib.h
ることを定めるとともに、その試作品です。ソースファイル myapp.c
さらに、ヘッダーは、直接に又は含む他のヘッダが含まれます。例えば:
/* myapp.h
** Here I will include and define my stuff
*/
...
#include "mylib.h"
...
ソースファイルを次のように記述されています。
/* myapp.c
** Here is my real code
*/
...
#include "myapp.h"
...
/* Here I can use the function */
myfunc(3,"XYZ");
今までコンパイルを取得する myapp.o
:
gcc -c -I../mylib/includes myapp.c
ことに注意いただけるかgccのヘッダファイルなものではないものである図書館そのもの!
現在リンクしていただいて構いませんのご応募をリアル図書館
gcc -o myapp -L../mylib/libs myapp.o -lmylib
ことに注意 -L
スイッチかgccの図書館は、 -l
れまでのリンクを設定コードの図書館があります。
ばんこの最後のステップでは、直面する可能性があり、問題ご説明します。
がその他のより複雑なケースからのご質問ありがとうこのにおいてどのように解決問題です。
メイクファイルと、呼び出そうとしているライブラリ関数を投稿します。単純なgcc makefileでさえ、通常、次のような行があります。
LIBFLAGS =-lc -lpthread -lrt -lstdc++ -lShared -L../shared
この場合、特に標準Cライブラリをリンクすることを意味します
リンカがライブラリを見つけることができるパスを追加する必要があると思います。 gcc / ldでは、-Lでこれを行うことができ、-lでlibrarayを実行できます。
-Ldir、-library-path = dir
標準の前にディレクトリdirを検索します 検索ディレクトリ(このオプションは 検索する-lオプションの前 そのディレクトリ)。
-larch、-library = archive
アーカイブファイルアーチを リンクするファイルのリスト。
回答への応答-.aライブラリファイルはありません。ライブラリには.hと.cだけが含まれているため、-lは適切ではありません
では、最初にライブラリを作成する必要がありますか?
gcc -c mylib.c -o mylib.o
ar rcs libmylib.a mylib.o
新しいバージョンのgccを使用してプログラムをビルドすると、この問題が発生しました。この問題は、-std = gnu89オプションを使用してgccを呼び出すことで修正されました。どうやら、これはインライン関数宣言によるものでした。このソリューションは https://gcc.gnu.org/gcc-5/porting_toで見つけました。 .html