c - 关于重复符号的奇怪 ld 错误

标签 c gcc ld compiler-errors duplicate-symbol

我有一个由两个文件组成的项目,main.c 和 logoff.c。当我尝试编译它们时出现此错误:

gcc -c -g -Wall main.c
gcc -c -g -Wall logoff.c
gcc -o main -g -Wall main.o logoff.o
ld: duplicate symbol _logoff in logoff.o and main.o

我在 logoff.c 中有一个名为 logoff 的函数,但我在 main.c 中搜索了文本“logoff”,但没有找到任何内容(甚至还没有调用该函数!)。

如果我将函数的名称更改为 log_off,它就会起作用。文件中还有第二个函数,除非也更改其名称,否则会导致相同的错误。

有什么原因会导致这种情况发生吗?我在两个不同的系统上都有这个问题。可能相关的一件事是我在另一个项目中使用了相同的 logoff.c 文件,但它没有连接到这个项目。

最佳答案

创建一个logoff.h文件,里面只有logoff的函数声明,比如

void logoff(void);

然后,在 main.c 中用 #include "logoff.h" 包含它。不要包含 logoff.c,因为编译器会编译该函数两次,然后链接器会看到两个同名函数。

如果将其更改为 log_off 似乎可以工作,然后只重新编译其中之一。另一个目标文件仍将编译旧的注销函数。因此链接器看到一个 log_off 和一个注销。这就是使用该名称似乎对您有用的原因。

关于c - 关于重复符号的奇怪 ld 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/297162/

相关文章:

c - 在c中读取csv文件的末尾

c - 为什么以及在何种意义上 pthread_t 是不透明类型?

C 程序返回 0 而不是整数输入序列中最大出现的整数

c - gcc 编译多个文件

c - 链接到多个库,其中一个库包装了一组系统调用

c - 我们如何删除未使用的 bss 符号?

c - PsLookupProcessByProcessId 与 DWORD pid?参数1需要HANDLE?

gcc - rbenv 安装失败(告诉我安装 GCC,但它已经安装了)

c - 如何在加载 Fortran 模块时自动运行用户代码

c++ - 有没有办法忽略未使用的 undefined reference ?