如何在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将它们捆绑到静态库中。