如何在 Linux 中编译静态库?

Posted

技术标签:

【中文标题】如何在 Linux 中编译静态库?【英文标题】:How to compile a static library in Linux? 【发布时间】:2011-02-13 15:37:55 【问题描述】:

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

【问题讨论】:

检查this 【参考方案1】:

见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 了解更多信息。

【讨论】:

-o 不是必需的。输出将是相同的 (out.o)【参考方案2】:

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

【讨论】:

【参考方案3】:

这里有一个完整的 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)

解释生成文件:

target: prerequisites - 规则负责人 $@ - 表示目标 $^ - 表示所有先决条件 $&lt; - 表示只是第一个先决条件 ar - 用于创建、修改和提取档案 see the man pages for further information 的 Linux 工具。这种情况下的选项意味着: r - 替换存档中现有的文件 c - 如果不存在则创建一个存档 s - 在存档中创建一个对象文件索引

总结:Linux下的静态库无非就是对象文件的存档。

ma​​in.c 使用库

#include <stdio.h>

#include "lib.h"

int main ( void )

    fun1(10);
    fun2(10);
    return 0;

lib.h lib 的主头文件

#ifndef LIB_H_INCLUDED
#define LIB_H_INCLUDED

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

#endif

lib1.c 第一个库源

#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 第二个库源

#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 */

【讨论】:

这将有助于指出命令的作用以及它们打算实现的目标。特别是在这种情况下,ar 需要解释,因为它是创建静态库的关键。 ar 程序创建、修改和从档案中提取,档案是单个文件,其结构中包含其他文件的集合,可以检索原始单个文件。当您指定修饰符 s 时,ar 为存档中可重定位对象模块中定义的符号创建索引。 (见man ar 请在您的标题中添加以下行以支持c++ 编译器:#ifdef __cplusplus extern "C" #endif . . . #ifdef __cplusplus #endif 这是一个绝妙的答案,谢谢!

以上是关于如何在 Linux 中编译静态库?的主要内容,如果未能解决你的问题,请参考以下文章

Linux2.6 如何编写Makefile,使驱动程序能够编译链接静态库

如何编译C/Fortran动态/静态链接库

linux 静态库和动态库编译的区别

请教关于linux中静态库与动态库的问题

linux 下C标准库是动态库还是静态库,还是两种库都提供了?

VS编译linux项目生成静态库并在另一个项目中静态链接的方法