我正在使用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 ++不允许创建两个具有相同名称的类。
有解决方案吗?我真的不想重构很大一部分代码。
答案 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)
引用解决方案/项目目录,并在另一个目录中引起同样的问题。