【问题标题】:Building a static library in C [closed]用 C 构建静态库 [关闭]
【发布时间】:2016-05-04 15:23:00
【问题描述】:

我想将两个源代码合并到一个 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

效果很好。

现在我要把它打包到一个静态库中。执行如下:

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”的未定义引用

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

【问题讨论】:

  • 了解头文件。不要包含实现文件。
  • 您似乎是针对 C 源文件而不是目标文件运行 ar

标签: c gcc dll static


【解决方案1】:

编译 - 不链接 - 源文件

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 来指定非标准位置 - 此处的当前目录。

【讨论】:

  • 哦,我看到了 .在导致问题的 -L mybe 之后...
  • 是的,您需要一个句点(.) 将链接器指向当前目录。
  • 谢谢不知道
  • @xetra11 : 另外,您需要使用 archive(ar) 命令而不是源文件来打包目标文件。
【解决方案2】:

问题是你链接的是源文件而不是目标文件

ar rcs librenderay.a renderay_core.c renderay_shapes.c

一定是这样的

ar rcs librenderay.a renderay_core.o renderay_shapes.o

附:你可以用 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)

【讨论】:

  • 啊啊啊,好吧,有点错字。谢谢老兄
猜你喜欢
  • 2012-04-25
  • 1970-01-01
  • 1970-01-01
  • 2019-12-19
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 2011-08-09
  • 2022-01-07
相关资源
最近更新 更多