c - 未定义对另一个库函数的引用

标签 c gcc linker

是的,我知道之前有很多人问过这个问题,但我仍然无法理解我的问题

我有 2 个库,比如说 liba 和 libb。 libb 使用 liba 但在 .a 中编译,因此它应该在编译时链接。 我有以下 GCC 命令:

gcc -o my_program  obj/mymain.o obj/myutils.o liba/liba.a libb/libb.a -Iinclude -Iliba -Ilibb

但是 GCC 返回了很多从 libb 函数到 liba 函数的“未定义的对...的引用”。

发生了什么事?我该怎么办?

谢谢

最佳答案

link 编译命令的命令求值非常重要。

当编译器看到 .o 文件时,它们会自动添加到目标二进制文件中,因此所有 .o 文件都存在。这会留下需要找到的未定义实体列表。

下一阶段是浏览库。搜索每个库,并将满足 undefined reference 的每个库的 .o 元素添加到目标二进制文件中。这总能解决一些问题。但是,它可能还有进一步的要求。所以添加一个库的一部分可能会添加到需要满足的元素。

当一个库需要另一个库时,需要在需要它的东西之后,满足它要求的库之前指定它。

如果 .o 文件也需要库的相同部分,则当从 .o 中删除代码(删除拉入库部分的机制)时,可能会出现此问题。

关于c - 未定义对另一个库函数的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42642542/

相关文章:

c - 无论 fork() 多少次,父进程仅从其子进程接收到 SIGCHLD 一两次

c++ - 这个循环如何使我的程序崩溃?

无法使用 IAR ARM 编译器强制函数表到特定地址

c++ - 为什么不在这个静态库中创建多个已定义的符号?

c - 程序将 int 转换为 ASCII,我不知道为什么?

c - 使用 scanf 的输入读取挂起

c - C中的数组和指针地址

c - 涉及静态局部变量的递归函数中的意外输出

c++ - 使用 void_t 和 protected 嵌套类进行基于 SFINAE 的检测

c++ - 为什么没有在这个 C++ 类的 .o 文件中定义一个函数?