C - "Already defined in object file"和"one or more multiply defined symbols found"



通过MSDN的RPC教程,我刚刚创建了一个包含两个.c文件的项目,如下所示:

/* file hellop.c */
#include <stdio.h>
#include <windows.h>
void HelloProc(char * pszString)
{
    printf("%sn", pszString);
    return ;
}  

/* file: hello.c */
#include "hellop.c"
void main(void)
{
    char * pszString = "Hello, World";
    HelloProc(pszString);
    return ;
}

问题::错误LNK2005和致命错误LNK1169

为什么以及编译器在哪里看到HelloProc(char*)的多符号定义或声明?

编辑::正如本SO_Question所总结的那样,包括.h文件显然是最好的解决方案。但是,这是否使我们没有实现可以将.c文件包含在另一个.c文件中的设计?

奇怪的行为::第一次编译运行良好,但解决方案的重建因上述错误而中断。您可以通过将文件名从 .c 更改为 .cpp 来检查多次首次编译,反之亦然。为什么会表现出这种行为?(我不确定是否有其他人也经历过给定的例子)

你编译了两次HelloProc,因为你通过#include "hellop.c"将这个函数的整个定义包含在hello.c文件中,而你只需要声明它。您应该将函数原型放在头文件中。

     #ifndef HELLOP_H
     #define HELLOP_H
     #include <stdio.h>
     #include <windows.h>
     void HelloProc(char * pszString);
     #endif

并在hellop.chello.c中包含头文件

编辑:#include不是你说的剪切粘贴,而是更多的复制粘贴

# 包含"q-char-sequence"换行符

导致该指令被 源文件由指定序列标识" 分隔符

因此,您可以与HelloProc的两个定义联系起来,一个在hellop.c中,另一个在hello.c中。解决它的另一种方法是仅编译hello.c文件,这样就没有重复的HelloProc。在此处查看如何在VisualStudio中执行此操作

相关内容

  • 没有找到相关文章

最新更新