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

138

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

Summer_More_More_Tea
источник
проверить это
Бухгалтер م

Ответы:

206

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

gcc -c -o out.o out.c

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

ar rcs libout.a out.o

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

Мэтью Флэшен
источник
90

Вот полный пример make-файла:

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)

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

  • target: prerequisites - глава правила
  • $@ - означает цель
  • $^ - означает все предпосылки
  • $< - означает только первое условие
  • ar- инструмент Linux для создания, изменения и извлечения из архивов см. справочные страницы для получения дополнительной информации . Варианты в этом случае означают:
    • r - заменить файлы, существующие внутри архива
    • c - создать архив, если он еще не существует
    • s - создать индекс объекта-файла в архиве

В заключение : статическая библиотека в Linux - это не что иное, как архив объектных файлов.

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

#include <stdio.h>

#include "lib.h"

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

lib.h главный заголовок библиотеки

#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 второй источник 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 */
Alex44
источник
это помогло бы указать, что команды делают и чего они намерены достичь. особенно в этом случае arнеобходимо объяснение, так как это ключ к созданию статической библиотеки.
Joost
1
arПрограмма создает, модифицирует и распаковывает из архивов, которые представляют собой отдельные файлы , проведение набора других файлов в структуре , которая позволяет получить исходные отдельные файлы. arсоздает индекс для символов, определенных в перемещаемых объектных модулях в архиве, когда вы указываете модификатор s. (см. man ar)
Alex44
2
пожалуйста добавьте следующие строки в ваш заголовок для поддержки c++компилятора: #ifdef __cplusplus extern "C" { #endif . . . #ifdef __cplusplus } #endif
Behrouz.M
12

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

Игнасио Васкес-Абрамс
источник