Linuxで静的ライブラリをコンパイルする方法は?


138

質問:Linuxで静的ライブラリをでコンパイルする方法gcc、つまり、ソースコードをout.aという名前のファイルにコンパイルする必要があります。コマンドで単純にコンパイルするだけで十分gcc -o out.a out.cですか?私はに詳しくありgccません。誰かが私に手を貸してくれることを願っています。


回答:


205

gnuコンパイラーを使用した共有および静的ライブラリーの作成[gcc]を参照してください

gcc -c -o out.o out.c

-c 実行可能ファイルではなく、中間オブジェクトファイルを作成することを意味します。

ar rcs libout.a out.o

これにより、静的ライブラリが作成されます。 r置換して挿入cすること、新しいアーカイブを作成すること、およびsインデックスを書き込むことを意味します。いつものように、詳細はmanページ参照してください。


89

ここでは完全なメイクファイルの例:

メイクファイル

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)

makefileの説明:

  • target: prerequisites -ルールヘッド
  • $@ -ターゲットを意味します
  • $^ -すべての前提条件を意味します
  • $< -最初の前提条件のみを意味します
  • ar-アーカイブから作成、変更、抽出するLinuxツール。詳細については、manページを参照してください。。。この場合のオプションの意味は次のとおりです。
    • r -アーカイブ内に存在するファイルを置き換えます
    • c -まだ存在しない場合は、アーカイブを作成します
    • s -オブジェクトファイルインデックスをアーカイブに作成する

結論:Linuxでの静的ライブラリは、オブジェクトファイルのアーカイブにすぎません。

libを使用したmain.c

#include <stdio.h>

#include "lib.h"

int main ( void )
{
    fun1(10);
    fun2(10);
    return 0;
}

lib.h libsメインヘッダー

#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.c 2番目のlibソース

#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 */

コマンドが何をするのか、そして彼らが何を達成しようとしているのかを指摘するのに役立つでしょう。これarは静的ライブラリを作成するための鍵であるため、特にこの場合は説明が必要です。
Joost

1
arプログラムは、元のファイルを個別に取得することを可能にする構造で、他のファイルのコレクションを保持し、単一のファイルであるアーカイブから、変更、および抽出物を作成します。ar修飾子sを指定すると、アーカイブ内の再配置可能オブジェクトモジュールで定義されたシンボルへのインデックスを作成します。(参照man ar
Alex44

2
サポートにごヘッダに以下の行を追加してくださいc++コンパイラ: #ifdef __cplusplus extern "C" { #endif . . . #ifdef __cplusplus } #endif
Behrouz.M

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