Як скласти статичну бібліотеку в Linux?


138

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


перевірити це
Бухгалтер від

Відповіді:


206

Див. Розділ Створення спільної та статичної бібліотеки за допомогою компілятора gnu [gcc]

gcc -c -o out.o out.c

-c означає створити файл посередника, а не виконавчий файл.

ar rcs libout.a out.o

Це створює статичну бібліотеку. rозначає вставити із заміною, cозначає створити новий архів і sозначає написати індекс. Як завжди, див. Довідкову сторінку для отримання додаткової інформації.


90

Ось повний приклад makefile:

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 для створення, модифікації та витягу з архівів див. довідкові сторінки для отримання додаткової інформації . Варіанти в цьому випадку означають:
    • r - замінити файли, наявні всередині архіву
    • c - створити архів, якщо він ще не існує
    • s - створити об'єкт-файл-індекс в архіві

На закінчення : Статична бібліотека під Linux - це не що інше, як архів файлів об'єктів.

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

#ifdef __cplusplus
   extern C {
#endif

void fun1 ( int x );

#ifdef __cplusplus
   }
#endif

#endif /* LIB1_H_INCLUDED */

lib2.c друге джерело

#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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.