C &引用;已在目标文件“中定义”;及;找到一个或多个多重定义符号;
在上阅读RPC教程, 我刚刚创建了一个包含两个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*) 编辑::如本文所述,
.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