Visual C ++ 2008 Express - cpp文件名冲突

时间:2009-12-28 09:34:25

标签: visual-c++ filenames conflict

我正在使用gcc 4和cmake开发GNU / Linux应用程序来管理编译过程。我发现,当有两个具有相同名称但在其他目录和命名空间中的文件时,没有问题:

.  
|-- gfx  
|   |-- Object.cpp  
|   `-- Object.h  
`-- logic  
    |-- Object.cpp  
    `-- Object.h  

第一个Object类位于Gfx名称空间中,第二个位于Logic名称空间中。

然后我尝试使用Visual C ++ 2008 Express Edition编译这个项目。 Linker抛出了几个关于Gfx :: Object类不存在的实现的错误。经过几次检查,我发现了:

  • Visual C ++正在跟踪两个Object.cpp文件
  • 当在第一个或第二个文件中发生更改时,对象单元的重新编译将排队
  • 无论实际修改哪个文件,它总是只重新编译第二个Object.cpp

我还发现Visual C ++不允许创建两个具有相同名称的类。

有解决方案吗?我真的不想重构很大一部分代码。

4 个答案:

答案 0 :(得分:7)

两个Object.cpp文件都将编译为Object.obj。进入同一目录。换句话说,编译的最后一个将覆盖第一个的Object.obj。是的,链接器不会被激动,你会得到多个定义的符号,因为它链接相同的Object.obj文件两次。

修复很简单,右键单击Object.cpp文件之一,属性,C / C ++,输出文件。将对象文件名从$(IntDir)\更改为,例如$(IntDir)\ $(InputName)2.obj

答案 1 :(得分:2)

问题是默认情况下VC ++ 2008将所有目标文件放在一个输出文件夹中,因此第一个object.obj文件的存在满足第二个的依赖关系,因此它不会被编译;即使它是,它也会覆盖第一个。

您需要做的是使中间目录设置依赖于正在编译的文件。但是我已经尝试将其设置为 $(InputDir)和其他各种组合,但是无法成功实现有效的配置,尽管可能。可用的宏记录为here

如果你没有使用“makefile”项目,并使用make,nmake或cmake或其他任何东西来管理构建,那是因为你正在做的事情没有根本错误(即使它是不明智的),它只是它不容易被IDE支持。

答案 2 :(得分:1)

这已经得到了解答,但我还想添加Visual Studio 2010会根据我对Beta 2的体验,在发生冲突时自动将两个.obj文件放入不同的目录。

编辑:哦,这是错的!真正的答案是CMake自动为我做了这件事。

答案 3 :(得分:0)

接受的解决方案并非最佳,因为它无法扩展。

在Visual Studio 2010中,我设置了

    Properties -> C/C++ -> Output Files -> Output File Name

    V:\%(Directory)$(PlatformName)_$(ConfigurationName)_%(Filename).obj

将OBJ文件放在源代码旁边,假设项目位于驱动器V上(不知道是否有宏)。

也不是最佳的 - 但至少我可以很容易地分叉许多源文件的子系统,而不会得到腱鞘炎。

顺便说一句:$(InputDir)引用解决方案/项目目录,并在另一个目录中引起同样的问题。