visual stdio不同目录下的文件重名,类重名问题解决方法

本文探讨了在VS2008和VS2012中遇到的因文件重名导致的编译警告和错误问题,并提供了通过命名空间和调整对象文件名的方法来解决这些问题。

以下测试是在vs2008和vs2012中进行的


先建一个空的Test控制台应用程序,目录结构如下:


temp1目录下有两个文件:hello.h, hello.cpp

// temp1, hello.h

#pragma once

class Hello
{
public:
	Hello();
};
// temp1, hello.cpp

#include "hello.h"
#include <iostream>

Hello::Hello()
{
	std::cout << "temp1, hello" << std::endl;
}

temp2目录下也有两个文件:hello.h, hello.cpp

// temp2, hello.h

#pragma once

class Hello
{
public:
	Hello();
};
// temp2, hello.cpp

#include "hello.h"
#include <iostream>

Hello::Hello()
{
	std::cout << "temp2, hello" << std::endl;
}


工程目录结构如下:


main.cpp代码如下:

#include <iostream>
#include "./temp1/hello.h"

int main(int argc, char *argv[])
{
	Hello h;

	system("pause");
}
我们知道这样肯定是有问题的,但是问题出在哪里呢?

首先,我们编译工程,output显示:

1>------ 已启动全部重新生成: 项目: Test, 配置: Debug Win32 ------
1>  hello.cpp
1>  hello.cpp
1>  main.cpp
1>  正在生成代码...
1>Debug\hello.obj : warning LNK4042: 对象被多次指定;已忽略多余的指定
1>  Test.vcxproj -> F:\project\TcpDemo\Debug\Test.exe
========== 全部重新生成: 成功 1 个,失败 0 个,跳过 0 个 ==========

注意这个warning, 由于两个文件重名了,即使它们在不同的目录,但是生成的obj文件是在同一个目录下,

所以导致相同名字的obj文件只有一个。这样就很清楚了Hello类只有一个编译成功了,另外一个被忽略了。

这样并不是我们想要的,因为即使这两个类名字相同但实现并不同。

简单的解决方法改个名字就可以了(还有一种方法最后再说),但是这样编译的时候又会造成一个问题,重复定义。

hello2.obj : error LNK2005: "public: __thiscall Hello::Hello(void)" (??0Hello@@QAE@XZ) 已经在 hello.obj 中定义

加命名空间就可以了,如:temp1中的hello在namespace temp1 { ... }中,temp2中的hello在namespace temp2{ ... }中。

这样问题就都解决了,如main.cpp代码如下,运行输出结果就是对的。

#include <iostream>
#include "./temp2/hello.h"
#include "./temp1/hello.h"

int main(int argc, char *argv[])
{
	temp1::Hello h1;
	temp2::Hello h2;

	system("pause");
}

其实我主要想说的是文件重名问题,改个文件名就Ok了,

但是有时候我们在不想改名字或者不方便改名的情况下怎么办呢?

在重复的cpp文件上单击鼠标右键->属性->输出文件->对象文件名$(IntDir)后面加上我们想要生成的对象文件名(只要obj文件不重名就可以了),如:

修改temp2目录下的hello.cpp对象文件名为:$(IntDir)hello2。




Visual Studio 项目中添加或引入文件可以通过多种方式实现,具体取决于所需添加的文件型(如源代码文件、头文件、资源文件等)以及项目型(如 C/C++、C#、VB.NET 等)。以下是几种常见方法: ### 添加现有文件到项目 1. **通过解决方案资源管理器添加文件** 在“解决方案资源管理器”中,右键点击目标项目,选择“添加” > “现有项”,然后浏览并选择要添加的文件。此方法适用于添加 `.cpp`、`.h`、`.cs`、`.xaml` 等多种型的文件[^4]。 2. **将文件复制到项目目录后添加** 将文件手动复制到项目文件夹中,然后在“解决方案资源管理器”中右键点击项目,选择“添加” > “现有项”。这种方式适用于需要将文件保留在项目结构中的情况。 ### 在项目中创建新文件 1. **通过“添加新项”对话框创建文件** 在“解决方案资源管理器”中右键点击项目,选择“添加” > “新建项”。可以选择模板创建新的代码文件、资源文件、配置文件等。例如,可以创建 `.cpp` 文件、`.h` 头文件、`.xaml` 页面等。 2. **使用快捷方式添加新文件** 可以直接在项目目录下手动创建文件(如使用文本编辑器创建 `.cpp` 或 `.h` 文件),然后在 Visual Studio 中刷新项目资源管理器,右键文件选择“括在项目中”以将其加入项目依赖管理。 ### 引入外部文件或库头文件 如果需要引入外部库的头文件或 DLL,可以在项目属性中进行配置: 1. **配置目录** 打开项目属性页(右键项目 > “属性”),进入“C/C++” > “常规” > “附加目录”,添加头文件所在的路径。例如:`C:\ExternalLibs\Include`。 2. **配置库目录与链接库** 在“链接器” > “常规” > “附加库目录”中添加库文件路径,如 `C:\Program Files\MATLAB\R2010a\extern\lib\win64\microsoft`,然后在“输入” > “附加依赖项”中添加具体的 `.lib` 文件名[^1]。 ### 多配置管理与文件含 如果希望某些文件仅在特定构建配置(如 Debug 或 Release)下含,可以在项目属性页中选择特定配置(如 Debug|x64 或 Release|x64),然后调整文件的编译选项或含状态。也可以通过“配置管理器”控制不同项目是否参与构建[^5]。 ```cpp // 示例:在 C++ 项目中手动含头文件 #include "MyHeader.h" ``` ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值