我错过了什么链接步骤?我正在尝试从文件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
如何正确链接文件?解决这个特定问题的参考文献非常棒。
答案 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
之外,一切实际上基本上就像编译常规可执行文件一样。)