【问题标题】:Why can't I link my C code with my library on Ubuntu? [duplicate]为什么我不能将我的 C 代码与我在 Ubuntu 上的库链接? [复制]
【发布时间】:2019-08-13 04:53:08
【问题描述】:
gcc -Wall -Werror -Wextra -Llibft -lft -Ilibft/include main.c

当我使用上面的命令时,链接器会抛出以下错误信息:

/tmp/ccwCUgov.o: In function `main':
main.c:(.text+0xc): undefined reference to `ft_putendl'
collect2: error: ld returned 1 exit status

不得不提一下libft/目录中确实存在使用中的库libft.a

我现在(2019)在 Ubuntu 18.04LTS 上编码,但我从未在 macOS 上遇到过这样的问题。

main.c中的代码:

#include "libft.h"

int main()
{
    ft_putendl("Hello world!");
    return (0);
}

【问题讨论】:

  • 语句#include "libft.h" 告诉编译器先在与源代码相同的目录中查找,然后在默认目录中查找。
  • @WeatherVane,#include 指令与链接有何关系?
  • @r3musn0x 问题说编译器错误,但现在你提到它 ld 是一个系统的链接器。 MSVC 会说:unresolved external symbol ft_putendl referenced in function _main,表示链接器错误。
  • @WeatherVane 我说我在我的 Mac 上编译了这段代码,没有弹出错误。我不明白为什么在 ubuntu 上会发生这种情况
  • 试着把-lft放在最后。

标签: c


【解决方案1】:

-lft 放在链接命令的最后,如下所示:

gcc -Wall -Werror -Wextra -Llibft -Ilibft/include main.c -lft

这会导致最后链接libft,这应该会导致包含所需的函数(链接器只包含需要的对象,并且在处理libft.a时,还不需要对象) .

这可能适用于 Mac,因为 Mac 包含存档中的所有对象,或者因为它最后链接库。

【讨论】:

  • 这是否意味着所有的库都应该最后添加?
  • @aihya 是的。除了可能的共享库(不确定它们是否已链接)。
  • 我的理解是编译器在运行的时候是按顺序编译对象的,也就是说如果某个对象文件a.o写在另一个b.o之前,而b.o又依赖a.o,那可能就不行了。反之亦然。对吗?
  • @aihya 正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
  • 2011-09-23
  • 1970-01-01
  • 2017-12-27
  • 1970-01-01
  • 2017-11-22
  • 2011-04-28
相关资源
最近更新 更多