同名cpp文件导致先生成的obj文件被后生成的obj覆盖-导致link error

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


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


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

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. // temp1, hello.h  
  2.   
  3. #pragma once  
  4.   
  5. class Hello  
  6. {  
  7. public:  
  8.     Hello();  
  9. };  
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. // temp1, hello.cpp  
  2.   
  3. #include "hello.h"  
  4. #include <iostream>  
  5.   
  6. Hello::Hello()  
  7. {  
  8.     std::cout << "temp1, hello" << std::endl;  
  9. }  

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

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. // temp2, hello.h  
  2.   
  3. #pragma once  
  4.   
  5. class Hello  
  6. {  
  7. public:  
  8.     Hello();  
  9. };  
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. // temp2, hello.cpp  
  2.   
  3. #include "hello.h"  
  4. #include <iostream>  
  5.   
  6. Hello::Hello()  
  7. {  
  8.     std::cout << "temp2, hello" << std::endl;  
  9. }  


工程目录结构如下:


main.cpp代码如下:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include <iostream>  
  2. #include "./temp1/hello.h"  
  3.   
  4. int main(int argc, char *argv[])  
  5. {  
  6.     Hello h;  
  7.   
  8.     system("pause");  
  9. }  
我们知道这样肯定是有问题的,但是问题出在哪里呢?

首先,我们编译工程,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代码如下,运行输出结果就是对的。

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include <iostream>  
  2. #include "./temp2/hello.h"  
  3. #include "./temp1/hello.h"  
  4.   
  5. int main(int argc, char *argv[])  
  6. {  
  7.     temp1::Hello h1;  
  8.     temp2::Hello h2;  
  9.   
  10.     system("pause");  
  11. }  

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

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

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

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


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值