我错过了什么链接步骤?我正在尝试从文件 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/