我有两个来源,我想组合成一个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”的未定义引用
告诉我链接到库失败了。我在这做错了什么?我错过了什么?
答案 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)