Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C &引用;已在目标文件“中定义”;及;找到一个或多个多重定义符号;_C_Visual C++_Visual Studio 2008_Lnk2005 - Fatal编程技术网

C &引用;已在目标文件“中定义”;及;找到一个或多个多重定义符号;

C &引用;已在目标文件“中定义”;及;找到一个或多个多重定义符号;,c,visual-c++,visual-studio-2008,lnk2005,C,Visual C++,Visual Studio 2008,Lnk2005,在上阅读RPC教程, 我刚刚创建了一个包含两个.c文件的项目,如下所示: /* file hellop.c */ #include <stdio.h> #include <windows.h> void HelloProc(char * pszString) { printf("%s\n", pszString); return ; } 问题::错误和致命错误 为什么编译器会看到多符号定义或声明HelloProc(char*) 编辑::如本文所述,

在上阅读RPC教程, 我刚刚创建了一个包含两个
.c
文件的项目,如下所示:

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

void HelloProc(char * pszString)
{
    printf("%s\n", pszString);
    return ;
}  
问题::错误和致命错误

为什么编译器会看到多符号定义或声明
HelloProc(char*)

编辑::如本文所述,包括
.h
文件显然是最好的解决方案。但是这会不会让我们无法实现将
.c
文件包含到另一个
.c
文件中的设计


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

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

     #ifndef HELLOP_H
     #define HELLOP_H

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

     void HelloProc(char * pszString);

     #endif
\ifndef HELLOP\H
#定义HELLOP_H
#包括
#包括
void HelloProc(char*pszString);
#恩迪夫
并在
hellop.c
hello.c

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

#包括“q-char-sequence”新行

使指令的全部内容替换该指令 由“”之间的指定序列标识的源文件 分隔符


因此,您可以链接到
HelloProc
的两个定义,一个在
hellop.c
中,另一个在
hello.c
中。另一种解决方法是只编译
hello.c
文件,这样就不会有重复的
HelloProc
。请参阅VisualStudio中的操作方法,谢谢您的回答,但我认为不会这就是问题所在。另外,我没有任何“main.c”文件,它是“hello.c”:-。我知道,将声明放在头文件中会很好,但我想知道这背后的原因是什么。“#include”就像剪切粘贴一样(粗略地说),那么这个错误就不应该发生了。@Abhineet我在我的机器上完全按照我的预期进行了检查:/home/davidbo/workarea/workspace/test/Debug/。/hellop.c:4:HelloProc的多个定义在哪里可以看到HelloProc的两个定义?正如你所说的,#include将像复制粘贴一样工作,所以整个“hellop.c”“将在hello.c中替换,并将被编译。在任何情况下,我已经尝试过警卫(他们是我被LNK2005击中时第一个尝试的人),但似乎不起作用。那么,警卫有帮助吗?:-)所以include是copy paste,这意味着在linkage中,您有两个
HelloProc
的定义,一个在hellop.obj中,它是第一次编译的,另一个在hello.obj中,您得到了相同函数的另一个定义。所以它编译了两次,现在它尝试链接
HelloProc
两次。
     #ifndef HELLOP_H
     #define HELLOP_H

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

     void HelloProc(char * pszString);

     #endif