这是我的文件夹结构:
/
|
-- 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
。结果,一个人覆盖了另一个。
答案 0 :(得分:12)
右键单击两个/ .cpp文件> properties
> C/C++
> Output Files
> Object File Name
>设置自定义名称。例如如果两个文件在文件夹MyFile.cpp
中都命名为A
,而在文件夹B
中命名为另一个,则可以将输出设置为AMyFile
和BMyFile
。
或者,您也可以使用宏在对象名称前加上直接父文件夹名称(即使用$(IntDir)\$(SafeParentName)$(SafeInputName)
)。如果这还不够(例如,您有A/B/MyFile.cpp
和C/B/MyFile.cpp
),并且您不介意让某些对象文件混乱您的源树,您也可以使用$(InputDir)\
来放置对象与源文件位于同一文件夹中的文件。
然后将cpp文件编译成两个不同的目标文件..
享受!
VS2010的更新:在VS2010中有一个更好的解决方案,请查看here。感谢n1ck的comment
顺便说一句,如果内容具有相同的名称,您是否使用不同的名称空间将它们分开?
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文件相同的目录中。缺点是源代码树上有一些垃圾。
我的个人观点是重构。