如何在Linux中编译静态库?


138

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


检查
会计师م

Answers:



89

这里是完整的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下的静态库只不过是目标文件的存档。

使用lib的main.c

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

它将有助于指出命令的作用以及它们打算实现的目标。特别是在这种情况下,ar需要进行解释,因为这是创建静态库的关键。
Joost

1
ar程序从档案中创建,修改和提取档案,这些档案是一个单一文件,在一个结构中包含其他文件的集合,从而可以检索原始的单个文件。ar当指定修饰符s时,将创建一个指向在归档中可重定位目标模块中定义的符号的索引。(请参阅man ar
Alex44 '16

2
请在标头中添加以下行以支持c++编译器: #ifdef __cplusplus extern "C" { #endif . . . #ifdef __cplusplus } #endif
Behrouz.M 2016年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.