直接问题:如果我有两个具有相同名称的文件(但在不同的目录中),似乎只有Visual Studio 2005可以透明地处理它?VS 2008和2010需要一堆调整?除了我的命名惯例,我做错了吗?
背景:
我正在开发C++统计库......我有两个文件夹:
/ Univariate
Normal.cpp
Normal.h
Beta.cpp
Beta.h
Adaptive.cpp
Adaptive.h
/ Multivariate
Normal.cpp
Normal.h
Beta.cpp
Beta.h
Adaptive.cpp
Adaptive.h
Run Code Online (Sandbox Code Playgroud)
我需要支持交叉编译 - 我使用g ++/make将这些相同的文件编译到Linux中的库中.他们工作得很好.
我一直在使用Visual Studio 2005而没有问题,但我需要升级到Visual Studio 2008或2010(目前在nVidia的nsight工具上流口水).但是,如果我将文件添加到具有相同名称的项目中(即使它们位于不同的目录中),我会遇到问题.我愿意改变我的命名惯例,但是我很好奇其他人是否遇到过这个问题并且找到了任何记录良好的解决方案?
我通过,如果我从2005年项目升级至2010年的项目,似乎VS 2010的事实进一步猛然一惊是能够正确地处理在不同目录中的两个名称相同的源文件; 但是,如果我删除其中一个重复文件,然后将其添加回项目,我会收到以下警告:
Distributions\Release\Adaptive.obj:警告LNK4042:指定了多次的对象; 临时演员被忽略了
现在我将中间目录指定为$(ProjectName)\ $(配置) - 我需要将我的目标文件放在与源代码树不同的位置.所以我可以看到为什么它将对象文件复制在一起,但是当项目从2005年转换到2008年或2010年时,会添加一堆条件编译:
<ObjectFileName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)%(Filename)1.obj</ObjectFileName>
<XMLDocumentationFileName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(IntDir)%(Filename)1.xdc</XMLDocumentationFileName>
Run Code Online (Sandbox Code Playgroud)
可以从C/C++ - >输出文件 - >"对象文件名"和"XML文档文件名"中的源文件属性页访问它们.但是,如果我只是直接添加文件(或删除并重新添加它们),VS在我尝试编译之前不会抱怨,但也从不添加条件指令 - 所以为了使事情正常工作,我必须为每个配置自己添加条件指令.我是犯了错误/不好的假设还是我在VS 2008/2010中发现了一个有效的错误?
c++ projects-and-solutions naming-conventions visual-studio-2010 visual-studio-2008
我有一个项目与一些文件夹碰巧包含具有相同名称的源文件.
我的源代码树看起来像这样:
project.pro
foo/
conflict.h
conflict.cpp
bar/
conflict.h
conflict.cpp
some.h
other.h
files.h
main.cpp
Run Code Online (Sandbox Code Playgroud)
默认情况下,qmake生成一个Makefile,它将生成如下构建树:
conflict.o
main.o
target
Run Code Online (Sandbox Code Playgroud)
哪里conflict.o是导致该目标文件都foo/conflict.cpp和foo/conflict.h.
我无法更改其名称,因为它们是使用外部工具生成的,强制使用不同的文件名意味着更改其内容,因此这不是一个选项.
我也不想使用qmake SUBDIRS模板,因为这意味着(1)每个子目录都是作为库单独构建的,因此整个构建过程(至少在我看来)和(2)在顶层非常复杂目录我不能有任何源文件.还是我错了?
我不能告诉qmake将目标文件写入构建目录中的单独目录吗?所以我的构建树将如下所示:
foo/
conflict.o
bar/
conflict.o
main.o
target
Run Code Online (Sandbox Code Playgroud)
或者是否有任何其他解决方案既不需要重命名源文件也不需要引入像静态库这样复杂的东西?我无法相信Qt多年来一直没有解决这个问题(在我看来很简单).(我已经在4年前解决了这个问题,但可以重命名该项目中的文件,而在这里我不能.)
如果它很重要:我在使用G ++的Ubuntu和使用mingw32的Windows上使用Qt 4.8.