【问题标题】:Why "strcat already defined in ***.obj"?为什么“strcat 已在 ***.obj 中定义”?
【发布时间】:2014-01-15 12:01:44
【问题描述】:

我只在中使用#include <stdio.h>

#include <stdio.h>

void strcat(char* s, char* t);

int main()
{
    char str1[12] = "hello";
    char str2[] = ",world";
    strcat(str1, str2);
    printf("%s\n", str1);
    return 0;
}

void strcat(char* s, char* t)
{
    int i = 0, j = 0;
    while(*s != '\0')
        i++;

    while((*(s + i++) = *(t + j++)) != '\0');

}

但是当我构建它时,控制台输出:

--------------------Configuration: test16 - Win32 Debug--------------------
Linking...
LIBCD.lib(strcat.obj) : error LNK2005: _strcat already defined in test16src.obj

为什么? strcat 是否存在于stdio.h 中?

PS: 能否通过描述与其他文件链接时的进度来解释链接错误?

【问题讨论】:

  • 头文件和库在 C 中不是一一对应的,而是在完全不同的编译阶段处理的。
  • 作为一个站点说明,拥有一个具有 C 库函数名称的函数是一个坏主意,具有几乎相同的语义,但仍然有不同的原型。

标签: c error-handling stdio strcat


【解决方案1】:

strcat 是一个 C 库函数。请参阅man strcatPOSIX (or here fo windows) 或string.h (POSIX)。

因此符号strcat 用于标准C 库(此处为LIBCD)中,该库在链接阶段自动链接到程序,您显示的错误发生在这里。

该错误通知您,通过编译您的源文件创建的目标文件 test16src.o 定义的符号 strcat 已存在于链接到 test16src.o 以创建最终可执行文件的标准库 (LIBCD) 中。

解决此符号名称冲突的方法为您的实现使用不同的名称,例如my_strcat()

【讨论】:

  • 但是我没用过"#include ".@alk
  • @alk:可能有人不知道如何处理man strcat (+1)
  • @Rubby,虽然通常只有在包含相应的标头时才会保留标识符,但也有一些总是保留的。特别是以str 开头的名字就是这种类型。
  • @alk,你能通过描述与其他文件链接时的进度来解释链接错误吗?
  • @Rubby:我不明白你的问题。请问您指的是哪个“其他文件”?这对您有帮助吗:msdn.microsoft.com/en-us/library/72zdcz6f.aspx
猜你喜欢
  • 2014-11-02
  • 2015-07-27
  • 1970-01-01
  • 1970-01-01
  • 2014-01-24
  • 2013-02-18
  • 2015-08-10
  • 2016-11-21
  • 2016-03-09
相关资源
最近更新 更多