c - 链接器错误: How can there be a duplicate symbol in just one file?

标签 c makefile linker linker-errors ld

据我了解,由于重复符号而导致的链接器错误意味着:

  1. 一个符号在多个源文件中定义
  2. 编译后在两个不同的目标文件中产生相同的符号
  3. 因此链接器不知道他应该链接到两个符号中的哪一个。

在尝试从 www.ugfx.io 编译演示项目时,我遇到了此错误:

duplicate symbol _main in:
    .build/obj/GFXLIB/demos/modules/gdisp/basics/main.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [.build/demotest.elf] Error 1

与我在网上找到的每个重复符号错误相比,只有一个文件被列为此错误的一部分。而属于这个目标文件的源文件只有一个主要符号。您可以查看here .

我该如何理解这个错误?其原因可能是什么?

最佳答案

当我在编译命令中两次包含相同的源文件时,就发生了这种情况,例如:

$gcc -o main main.c becool.c foo.c bar.c becool.c end.c

重复的 becool.c 导致重复符号错误。

所以,如果这是问题所在,只需检查您的编译命令并删除此类重复项

关于c - 链接器错误: How can there be a duplicate symbol in just one file?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45566664/

相关文章:

c - 使用 cmake 链接 DX10

c++ - 为什么很少有人输入 const 正确的代码? const 正确的代码会编译得更好/更快吗?

c - 访问由 C 中的函数修改的字符串数组时出现段错误

c++ - Makefile 条件语句

c++ - 仅重新编译更改的文件(两步)

linker - 在调用 ELF 的默认入口点之前是否运行任何用户模式代码?

assembly - 如何在不影响rip相对寻址的情况下正确链接两个目标文件?

c++ - 在 C++ 中将 memset 设置为 INT_MAX

c - 使用 free(N) 删除 BST 中的节点

c++ - 我是否正确使用了 C++ 的 Makefile?