如何在Linux中编译静态库?
我有一个问题:如何编译一个静态库在Linux与GCC,即我需要编译我的源代码到一个名为out.a的文件。 用命令gcc -o out.a out.c
编译就足够了吗? 我对gcc不太熟悉,希望有人能帮我一把。
请参阅使用gnu编译器创build共享库和静态库[gcc]
gcc -c -o out.o out.c
-c
意味着创build一个中介对象文件,而不是一个可执行文件。
ar rcs libout.a out.o
这创build了静态库。 r
表示插入replace, c
表示创build新的存档, s
表示写入索引。 与往常一样,请参阅手册页获取更多信息。
这里有一个完整的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)
解释makefile:
-
target: prerequisites
– 规则头 -
$@
– 表示目标 -
$^
– 表示所有先决条件 -
$<
– 意味着只是第一个先决条件
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
使用gcc生成目标文件,然后使用ar
将它们捆绑到静态库中。