gpt4 book ai didi

创建一个简单的动态库

转载 作者:行者123 更新时间:2023-12-02 01:49:04 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com