“已在对象文件中定义”和“找到一个或多个多重定义的符号”

时间:2014-04-02 06:04:09

标签: c visual-c++ visual-studio-2008 lnk2005

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

/* file hellop.c */
#include <stdio.h>
#include <windows.h>

void HelloProc(char * pszString)
{
    printf("%s\n", 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来检查多次首次编译,反之亦然。为什么会出现这种行为? (我不确定是否还有其他人在给定的例子中也遇到过这种情况)

1 个答案:

答案 0 :(得分:2)

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

     #ifndef HELLOP_H
     #define HELLOP_H

     #include <stdio.h>
     #include <windows.h>

     void HelloProc(char * pszString);

     #endif

并在hellop.chello.c

中包含头文件

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

  

#include&#34; q-char-sequence&#34;新行

     

导致该指令的全部内容被替换   源文件由&#34;之间的指定序列标识。   分隔符

因此,您可以与HelloProchellop.c的两个定义以及hello.c中的另一个定义建立联系。另一种解决方法是仅编译hello.c文件,这样就没有HelloProc的重复。了解如何在VisualStudio here

中执行此操作