问题
在vs2019环境中,现在开发一个较大的C++项目,它的源文件在多个文件夹中组织(在文件系统上)。在其中两个文件夹中,有几个同名的文件。如:
.\ConsoleApplication1\JAMGEN_CONFIG_x4_test\firls.c
.\ConsoleApplication1\NoiseConfig_test\firls.c
两个firls.c中的函数名称都是一样的,只是函数实现的逻辑不一样。
在VS2019工程可以多添加几个"筛选器"(虚拟文件夹),这些虚拟文件名称大致与文件所在的目录对应,这个就把文件名相同的文件隔离开了。添加的方法如下图所示:
现在的问题是,当我构建这个项目时,VS2019把目标文件放在一个单一的目录中,结果是:
.\ConsoleApplication1\Debug\firls.obj
程序编译完你可以在输出窗口看到一条警告:
提示文件firls.c已经有了,再次编译它时忽略多余的指定;此时程序并没有报错,只是编译给了警告提示;但是程序的逻辑后面一个调用firls.c里面的函数的执行结果肯定是不对的。
此时我把.\ConsoleApplication1\NoiseConfig_test\firls.c里面的函数名称改一下,换一个不同的函数名称,Debug目录还是看一样:
.\ConsoleApplication1\Debug\firls.obj
但是编译的时候出错了,如下图所示:
看来还是不行,那是因为函数名称改了,在之前编译的firls.obj找不到这个函数,链接报错了。是否有一种方法可以让MSVC根据目录(或过滤器)来创建具有惟一名称的对象文件?我想这样:
.\ConsoleApplication1\Debug\JAMGEN_CONFIG_x4_test\firls.obj
.\ConsoleApplication1\Debug\NoiseConfig_test\firls.obj
解决方案
您可以设置项目范围的“对象文件名”(配置属性->C/ c++ ->输出文件)
$(IntDir)%(RelativeDir)
具体设置如下图所示:
设置完,在编译一次,在Debug目录下,果然分目录生成.obj文件,像这样:
.\ConsoleApplication1\Debug\JAMGEN_CONFIG_x4_test\firls.obj
.\ConsoleApplication1\Debug\NoiseConfig_test\firls.obj
达到预期的效果了,注意配置的时候使用源文件的相对源文件夹。注意%,但是如果您的源文件位于您的项目目录中,其中包含..\。