如何在 Linux 中编译静态库?

我有一个问题: 如何用 gcc在 Linux 中编译一个静态库,也就是说,我需要将我的源代码编译成一个名为 out.a 的文件。只用命令 gcc -o out.a out.c编译就足够了吗?我对 gcc不是很熟悉,希望有人能帮我一把。

224289 次浏览

参见 使用 gnu 编译器[ gcc ]创建一个共享的静态库

gcc -c -o out.o out.c

-c意味着创建一个中间对象文件,而不是一个可执行文件。

ar rcs libout.a out.o
 

这将创建静态库。r表示用替换插入,c表示创建新的归档,s表示编写索引。像往常一样,查看 手册获得更多信息。

使用 gcc 生成目标文件,然后使用 ar将它们绑定到一个静态库中。

下面是一个完整的 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)

解释 makefile:

  • target: prerequisites-规则头
  • $@表示目标
  • $^-意味着所有先决条件
  • $<-意味着只是第一个先决条件
  • ar-一个 Linux 工具,用于创建、修改和提取档案 有关更多信息,请参见手册页。本例中的选项意味着:
    • r-替换存档中存在的文件
    • c-创建一个存档文件,如果不存在
    • s-在归档文件中创建一个对象文件索引

结论 : Linux 下的静态库不过是目标文件的归档文件。

C < em > 使用 lib

#include <stdio.h>


#include "lib.h"


int main ( void )
{
fun1(10);
fun2(10);
return 0;
}

Lib.h < em > libs 主标题

#ifndef LIB_H_INCLUDED
#define LIB_H_INCLUDED


#include "lib1.h"
#include "lib2.h"


#endif

Lib1.c < em > first lib source

#include "lib1.h"


#include <stdio.h>


void fun1 ( int x )
{
printf("%i\n",x);
}

Lib1.h < em > 对应的头

#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 < em > second lib source

#include "lib2.h"


#include <stdio.h>


void fun2 ( int x )
{
printf("%i\n",2*x);
}

Lib2.h < em > 对应的头

#ifndef LIB2_H_INCLUDED
#define LIB2_H_INCLUDED


#ifdef __cplusplus
extern “C” {
#endif


void fun2 ( int x );


#ifdef __cplusplus
}
#endif


#endif /* LIB2_H_INCLUDED */