在C中构建静态库

时间:2016-05-04 15:23:01

标签: c gcc dll static

我有两个来源,我想组合成一个C静态库。

renderay_core.c
renderay_shapes.c

及其相应的头文件。我首先将它编译为独立(非库)以避免错误。

test.c

#include <stdio.h>
#include "renderay_core.c"
#include "renderay_shapes.c"

int main(void){ 
  Canvas* canvas = new_Canvas(5,5);
  printf("Test");
}

编译它:

gcc test.c renderay_core.c renderay_shapes.c -o main.exe

它工作正常。

现在我要把它打包成一个静态的lib。按照以下步骤操作:

gcc -c renderay_core.c renderay_shapes.c

现在我已准备好将对象链接为库。

ar rcs librenderay.a renderay_core.c renderay_shapes.c

我使用的命令是什么。然后我尝试用库而不是普通的源文件编译我的test.c。

gcc test.c -o main.exe -static -L -lrenderay

现在,当我尝试编译时,我收到错误警告:

  

对“new_Canvas”的未定义引用

告诉我链接到库失败了。我在这做错了什么?我错过了什么?

2 个答案:

答案 0 :(得分:2)

编译 - 无需链接 - 源文件

gcc -c renderay_core.c -o renderay_core.o
gcc -c renderay_shapes.c -o renderay_shapes.o

然后打包

ar -rcs librenderay.a renderay_core.o renderay_shapes.o

使用

链接到它
gcc test.c -o main.exe -static -L. -lrenderay

您需要L在此处指定非标准位置 - 当前目录。

答案 1 :(得分:0)

问题是您要链接源文件而不是目标文件

ar rcs librenderay.a renderay_core.c renderay_shapes.c

必须是那样的

ar rcs librenderay.a renderay_core.o renderay_shapes.o

P.S。您可以使用Makefile

执行此操作
CFLAGS = -O2 -Wall -fPIC
OBJS = renderay_core.o renderay_shapes.o

.c.o:
    $(CC) $(CFLAGS) -c $<

librenderay.a: $(OBJS)
    $(AR) rcs librenderay.a $(OBJS)

.PHONY: clean
clean:
    $(RM) librenderay.a $(OBJS)