创建一个简单的动态库

时间:2014-05-27 03:26:09

标签: 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 

如何正确链接文件?解决这个特定问题的参考文献非常棒。

1 个答案:

答案 0 :(得分:2)

因此,您的第一行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之外,一切实际上基本上就像编译常规可执行文件一样。)