创建一个简单的动态库

标签 c gcc

我错过了什么链接步骤?我正在尝试从文件 c.c 中创建一个动态库:

#include "a.h"
#include "b.h"

int my_function(void)
{
  return a() + EIGHT;
}

这取决于a.c:

int a(void)
{
  return 1;
}

b.h:

enum {
  EIGHT = 8,
};

我运行 gcc -c c.c -o c.o 来编译目标文件。然后我跑

gcc -Wall -dynamiclib -o libc.dylib c.c

我得到了这个错误。

Undefined symbols for architecture x86_64:
  "_a", referenced from:
      _b in ccx5LSkL.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status 

如何正确链接文件?解决这个特定问题的引用资料会很棒。

最佳答案

因此,您的第一行 gcc -c c.c -o c.o 编译了目标文件 c.o。现在您必须使用 c.o 来创建最终结果。所以您的链接步骤应该使用 c.o,而不是 c.c

接下来,您遇到的错误是未找到符号 "_a"。这是来自您调用函数 a(),但未将其包含在链接步骤中。为此,您还需要编译 a.c 并在链接最终产品时包含它。

总的来说,您的流程应该是:

1)编译:

gcc -c a.c -o a.o
gcc -c c.c -o c.o

2)链接:

gcc -Wall -dynamiclib -o libc.dylib a.o c.o

请注意,要编译 libc.dylib,您必须包含最终结果所依赖的所有源。

最后,您实际上不需要单独编译所有目标文件。只需立即提供 *.c 文件,您就可以在一个组合步骤中编译和链接在一起。

gcc -Wall -dynamiclib -o libc.dylib a.c c.c

所以您的问题实际上只是没有将这两个来源包括在一起。 (除了 -dynamiclib 之外,一切实际上基本上都像编译常规可执行文件一样工作。)

关于创建一个简单的动态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23880601/

相关文章:

gcc - 去掉cpp生成的注释

gcc - 为什么链接库的顺序有时会导致 GCC 出错?

c - 在C中如何防止UDP数据包被重复或丢弃?

c - 在 C 中使用一维数组进行矩阵乘法

c - 有没有办法将 stderr 重定向到在 bash、csh 和 dash 中工作的文件?

c++ - 在 GCC 而不是 Clang 中编写 SIGSEGV 代码

c - 链接时出现错误 "multiple definitions"的原因可能是什么?

c++ - 避免违反严格别名规则的最简单经验法则?

java - 使用 gcc 通过 javacode 编译 C 源代码

c++ - 带有 "noexcept"构造函数的程序被 gcc 接受,被 clang 拒绝