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

Agn*_*ian 8 c++ linker-errors visual-studio-2008 visual-c++-2008 visual-c++

这是我的文件夹结构:

/
|
 -- 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
Run Code Online (Sandbox Code Playgroud)

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

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

  1. 这是预期的行为吗?
  2. 如何构建一个C++二进制文件,其中包含两个具有相同名称的文件(尽管在不同的文件夹中)?

Afr*_*ief 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中有一个更好的解决方案,请在此处查看.感谢n1ck评论

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

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;
}
Run Code Online (Sandbox Code Playgroud)

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

  • @afriza:是的,我想$(InputDir)可以在生死攸关的情况下工作,但这比在我的情况下"手动"做得更糟,因为它会污染带有大量目标文件的src/dir.无论如何,它已在msvc2010(http://stackoverflow.com/questions/3695174/visual-studio-2010s-strange-warning-lnk4042/3731643#3731643)中修复,因此对我来说这不是一个问题. (2认同)