質問があります:gccを使用してLinuxで静的ライブラリをコンパイルする方法、つまり、ソースコードをout.aという名前のファイルにコンパイルする必要があります。コマンドgcc -o out.a out.c
でコンパイルするだけで十分ですか?私はgccにあまり詳しくありませんが、誰もが私に手を貸してくれることを願っています。
gnuコンパイラーによる共有および静的ライブラリーの作成[gcc] を参照してください。
gcc -c -o out.o out.c
-c
は、実行可能ファイルではなく、中間オブジェクトファイルを作成することを意味します。
ar rcs libout.a out.o
これにより、静的ライブラリが作成されます。 r
は置換で挿入することを意味し、c
は新しいアーカイブを作成することを意味し、s
はインデックスを書き込むことを意味します。いつものように、詳細は manページ をご覧ください。
ここに完全なメイクファイルの例:
makefile
TARGET = prog
$(TARGET): main.o lib.a
gcc $^ -o $@
main.o: main.c
gcc -c $< -o $@
lib.a: lib1.o lib2.o
ar rcs $@ $^
lib1.o: lib1.c lib1.h
gcc -c -o $@ $<
lib2.o: lib2.c lib2.h
gcc -c -o $@ $<
clean:
rm -f *.o *.a $(TARGET)
メイクファイルの説明:
target: prerequisites
-ルールの頭$@
-ターゲットを意味します$^
-すべての前提条件を意味します$<
-最初の前提条件のみを意味しますar
-アーカイブを作成、変更、および抽出するLinuxツール 詳細についてはmanページを参照 。この場合のオプションの意味は次のとおりです。r
-アーカイブ内に存在するファイルを置き換えますc
-まだ存在しない場合はアーカイブを作成しますs
-アーカイブにオブジェクトファイルインデックスを作成します結論::Linuxの静的ライブラリは、オブジェクトファイルのアーカイブにすぎません。
main.clibを使用
#include <stdio.h>
#include "lib.h"
int main ( void )
{
fun1(10);
fun2(10);
return 0;
}
lib.hlibsメインヘッダー
#ifndef LIB_H_INCLUDED
#define LIB_H_INCLUDED
#include "lib1.h"
#include "lib2.h"
#endif
lib1.c最初のlibソース
#include "lib1.h"
#include <stdio.h>
void fun1 ( int x )
{
printf("%i\n",x);
}
lib1.h対応するヘッダー
#ifndef LIB1_H_INCLUDED
#define LIB1_H_INCLUDED
#ifdef __cplusplus
extern “C” {
#endif
void fun1 ( int x );
#ifdef __cplusplus
}
#endif
#endif /* LIB1_H_INCLUDED */
lib2.csecond lib source
#include "lib2.h"
#include <stdio.h>
void fun2 ( int x )
{
printf("%i\n",2*x);
}
lib2.h対応するヘッダー
#ifndef LIB2_H_INCLUDED
#define LIB2_H_INCLUDED
#ifdef __cplusplus
extern “C” {
#endif
void fun2 ( int x );
#ifdef __cplusplus
}
#endif
#endif /* LIB2_H_INCLUDED */
Gccでオブジェクトファイルを生成し、ar
を使用してそれらを静的ライブラリにバンドルします。