问题描述
- visual stdio2010 c++ 中怎么编译多文件
-
请问如何visual stdio 2010 c++ 中编译多文件。我的情况是这样的,使用了默认的windons console 模式。在工程中,包含了stdafx.h stdafx.cpp targetver.h和main.cpp这几个文件.我在写入一个test.cpp文件,里面有一个函数void test().但是总是提示我说:找到一个或多个多重定义的符号。不知道一般怎样在visual stdio中写这样的包含文件的工程啊?
解决方案
如果这个函数已经在另一个文件定义,这里只是声明函数原型,前面要加上extern
extern void test();
解决方案二:
找到一个或多个多重定义的符号,是指的你在 test.cpp 文件里面定义的函数void test() 吗?如果是,说明重复定义了。
两个改法:
(1)如果与已经有的 test() 函数功能是相同的,则在 test.cpp 中只需要声明就可以使用了。**不能再次定义**!
(2)如果与已经有的 test() 函数功能是不同的,则只能采用另一个函数名。
解决方案三:
如果与已经有的 test() 函数功能是相同的,则在 test.cpp 中只需要声明就可以使用了。**不能再次定义**!
解决方案四:
我把代码贴出来吧。
test.cpp
#include
void test()
{
std::cout << "hello world!" << std::endl;
}
main.cpp
#include
#include "test.cpp"
using namespace std;
int main()
{
test();
return 0;
}
F7编译的时候出现错误,1>zmain.obj : error LNK2005: "void __cdecl test(void)" (?test@@YAXXZ) already defined in test.obj
1>X:newclassmaketestDebugmaketest.exe : fatal error LNK1169: one or more multiply defined symbols found
请大家看看啊
解决方案五:
有两种方法可以解决这个问题了,一个是在void test()前面加上inline关键词,另外一种就是加上一个"test.h"文件,再在"test.cpp"中用include包含
就可以通过,代码是这样的:
test.h
#include
void test();
test.cpp
#include "test.h"
void test()
{
std::cout << "hello world a!" << std::endl;
}
main.cpp
#include
#include "test.h"
using namespace std;
int main()
{
test();
return 0;
}
问题是,一定要这两种才行么?我之前不加.h文件为什么不可以呢?
解决方案六:
#include "test.cpp" 这种把实现文件当作头文件使用的方法是不推荐的
解决方案是
1)添加一个 头文件 test.h
写上
extern void test();
或者
void test();
函数的外部声明,通常不需要加上 extern
因为函数缺省就是 extern 存储类型的。
#include "test.cpp"
改成
#include "test.h"
另一种方法是:
不编译 "test.cpp" , test.cpp不添加到工程中,只是放到目录中,当作头文件使用
这个方法是不推荐的
解决方案七:
工程文件实质上是一种 makefile 性质的文件
凡是添加到工程文件中的 实现文件,通常都会编译为目标文件 (*。obj),链接到可执行文件中。
所以,#include "test.cpp"
这种方式,或造成 "test.cpp" 内的代码被编译两次以上
1次 编译到 test.obj 中
此外还会编译到其他 .obj 中
这样一份代码,就生成多个 同名函数的代码
自然链接的时候就出现多重定义了
解决方案八:
头文件是否重复包含,函数重名了,多次定义
解决方案九:
首先建立一个工程,然后把源文件添加进去。你为每一个c文件建立一个对应的h文件,其他别的c文件调用时只用加上你用的那个对应的h文件