web-dev-qa-db-ja.com

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

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

123

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

gcc -c -o out.o out.c

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

ar rcs libout.a out.o

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

190

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

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 */
76
Alex44

Gccでオブジェクトファイルを生成し、arを使用してそれらを静的ライブラリにバンドルします。