Как скомпилировать статическую библиотеку в Linux?

У меня вопрос: как скомпилировать статическую библиотеку в linux с gcc, т.е. мне нужно скомпилировать исходный код в файл с именем out.a. Достаточно ли просто компилировать команду gcc -o out.a out.c? Я не совсем знаком с gcc, надеюсь, что кто-то может дать мне руку.

Ответ 1

См. Создание общей и статической библиотеки с помощью gnu-компилятора [gcc]

gcc -c -o out.o out.c

-c означает создание промежуточного объектного файла, а не исполняемого файла.

ar rcs libout.a out.o

Это создает статическую библиотеку. r означает вставку с заменой, c означает создание нового архива, а s означает запись индекса. Как всегда, см. man page для получения дополнительной информации.

Ответ 2

Здесь приведен полный пример файла makefile:

Makefile

TARGET = prog

$(TARGET): main.o lib.a
    gcc $^ -o [email protected]

main.o: main.c
    gcc -c $< -o [email protected]

lib.a: lib1.o lib2.o
    ar rcs [email protected] $^

lib1.o: lib1.c lib1.h
    gcc -c -o [email protected] $<

lib2.o: lib2.c lib2.h
    gcc -c -o [email protected] $<

clean:
    rm -f *.o *.a $(TARGET)

объяснение файла makefile:

  • target: prerequisites - глава правила
  • [email protected] - означает цель
  • $^ - означает все предпосылки
  • $< - означает только первое предварительное условие

main.c, используя lib

#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

void fun1 ( int x );

#endif

lib2.c второй источник 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

void fun2 ( int x );

#endif

Ответ 3

Создайте объектные файлы с помощью gcc, затем используйте ar для их объединения в статическую библиотеку.