如何在linux中编译静态库?

问题描述 投票:122回答:3

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

gcc static-libraries
3个回答
185
投票

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


73
投票

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

9
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.