用 C 语言构建静态库

xet*_*a11 2 c dll static gcc

我想将两个源合并到一个 C 静态库中。

renderay_core.c
renderay_shapes.c
Run Code Online (Sandbox Code Playgroud)

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

测试.c

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

int main(void){ 
  Canvas* canvas = new_Canvas(5,5);
  printf("Test");
}
Run Code Online (Sandbox Code Playgroud)

编译它:

gcc test.c renderay_core.c renderay_shapes.c -o main.exe
Run Code Online (Sandbox Code Playgroud)

效果很好。

现在我准备将其打包到静态库中。做如下:

gcc -c renderay_core.c renderay_shapes.c
Run Code Online (Sandbox Code Playgroud)

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

ar rcs librenderay.a renderay_core.c renderay_shapes.c
Run Code Online (Sandbox Code Playgroud)

是我为此使用的命令。然后我尝试使用库而不是纯源文件来编译 test.c。

gcc test.c -o main.exe -static -L -lrenderay
Run Code Online (Sandbox Code Playgroud)

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

对“new_Canvas”的未定义引用

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

sjs*_*sam 7

编译 - 不链接 - 源文件

gcc -c renderay_core.c -o renderay_core.o
gcc -c renderay_shapes.c -o renderay_shapes.o
Run Code Online (Sandbox Code Playgroud)

然后打包

ar -rcs librenderay.a renderay_core.o renderay_shapes.o
Run Code Online (Sandbox Code Playgroud)

并使用链接到它

gcc test.c -o main.exe -static -L. -lrenderay
Run Code Online (Sandbox Code Playgroud)

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