VS2008:我可以在不同的文件夹中构建一个包含2个同名CPP文件的项目吗?

时间:2010-02-17 14:42:37

标签: c++ visual-studio-2008 visual-c++ linker-errors visual-c++-2008

这是我的文件夹结构:

/
|
 -- program.cpp
 -- utility.h
 -- utility.cpp
|
 -- module/
    |
     -- utility.h
     -- utility.cpp

// Note that I have two files named utility.h and two named utility.cpp

在构建项目时,我收到链接错误(LNK2028:未解析的令牌等等......),说明某些符号未定义。我已经确认所有符号都已定义,并且所有声明的函数都有相应的定义。

我感觉在编译项目时,两个文件夹中的utility.cpp文件都编译到输出文件夹中的相同utility.obj。结果,一个人覆盖了另一个。

  1. 这是预期的行为吗?
  2. 我该怎么做 构建一个有两个的C ++二进制文件 具有相同名称的文件(尽管在 不同的文件夹)?

6 个答案:

答案 0 :(得分:12)

右键单击两个/ .cpp文件> properties> C/C++> Output Files> Object File Name>设置自定义名称。例如如果两个文件在文件夹MyFile.cpp中都命名为A,而在文件夹B中命名为另一个,则可以将输出设置为AMyFileBMyFile

或者,您也可以使用宏在对象名称前加上直接父文件夹名称(即使用$(IntDir)\$(SafeParentName)$(SafeInputName))。如果这还不够(例如,您有A/B/MyFile.cppC/B/MyFile.cpp),并且您不介意让某些对象文件混乱您的源树,您也可以使用$(InputDir)\来放置对象与源文件位于同一文件夹中的文件。

然后将cpp文件编译成两个不同的目标文件..

享受!

VS2010的更新:在VS2010中有一个更好的解决方案,请查看here。感谢n1ckcomment

顺便说一句,如果内容具有相同的名称,您是否使用不同的名称空间将它们分开?

namespace A { // in folder A
    class CMyFile {};
};

namespace B{ // in folder B
    class CMyFile {};
};

// client.cpp
#include "A/MyFile.h"
#include "B/MyFile.h"
int main() {
    A::CMyFile aMyFile;
    B::CMyFile bMyFile;
    return 0;
}

我不知道这是否重要,但对人类来说更明确:D

答案 1 :(得分:2)

您可以尝试在解决方案中添加另一个项目,该项目将从您的模块mudule.lib .cpp构建一个静态.h文件,然后将您的主项目与该lib链接。它应该使VS在单独的目录中输出.obj文件,你应该能够没有问题地链接。

答案 2 :(得分:1)

你真的想在同一个项目中找到两个不同但同名的文件吗?

答案 3 :(得分:1)

最简单的方法就是将冲突的.objs放在不同的子文件夹中(我在2003年和2008年使用过这种技术)基于源dirs。

例如:

对于src \ gui \ utils.cpp,将“Object File Name”设置为“。\ Debug \ gui /”并且 对于src \ database \ utils.cpp,将其设置为“。\ Debug \ database /".

虽然每当发现冲突时我会手动执行此操作,但我可以想象,为每个.cpp文件(或仅针对冲突的文件)编写更新项目的脚本将是一项非常简单的任务。

答案 4 :(得分:0)

也许库(静态或动态)可以帮助你的案例。但是,如果存在任何具有相同名称的公共符号(如可执行文件或其他库中),则仍会出现问题。

答案 5 :(得分:0)

我不知道VS编译链。

但是,每个.cpp首先编译为.obj文件。链接步骤将它们合并在一起。

将所有.obj文件放在同一目录中非常常见。所以,正如你猜测的那样,在编译第二个时,擦除第一个。因此在编译期间缺少一些符号。

可能有一个选项(再次,我不使用VS)将.obj保留在与.cpp文件相同的目录中。缺点是源代码树上有一些垃圾。

我的个人观点是重构。