У меня вопрос: как скомпилировать статическую библиотеку в linux с gcc, т.е. мне нужно скомпилировать исходный код в файл с именем out.a. Достаточно ли просто компилировать команду gcc -o out.a out.c
? Я не совсем знаком с gcc, надеюсь, что кто-то может дать мне руку.
Как скомпилировать статическую библиотеку в Linux?
Ответ 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
для их объединения в статическую библиотеку.