我有一个问题:如何使用gcc在linux中编译静态库,即我需要将我的源代码编译成名为out.a的文件。用命令gcc -o out.a out.c
简单编译就足够了吗?我对gcc不是很熟悉,希望有人能帮帮我。
见Creating a shared and static library with the gnu compiler [gcc]
gcc -c -o out.o out.c
-c
意味着创建一个中间对象文件,而不是可执行文件。
ar rcs libout.a out.o
这将创建静态库。 r
表示插入替换,c
表示创建新存档,s
表示编写索引。与往常一样,请参阅man page了解更多信息。
这里有一个完整的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
- 规则负责人$@
- 意味着目标$^
- 意味着所有先决条件$<
- 意味着第一个先决条件ar
- 一个用于创建,修改和提取档案see the man pages for further information的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第二个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 */
使用gcc生成目标文件,然后使用ar
将它们捆绑到静态库中。