我刚刚被Visual Studio 2010(C++)发出的一些非平凡的警告殴打(而不是很难).
编译给出了以下输出:
1 Debug\is.obj:警告LNK4042:对象指定多次; 附加项忽略
1 Debug\make.obj:警告LNK4042:对象指定多次; extras忽略
1 Debug\view.obj:警告LNK4042:对象指定多次; extras忽略
1 identity.obj:错误LNK2019:未解析的外部符号void __cdecl test::identity::view(void)(?view @ identity @ test @@ YAXXZ)在函数中引用void __cdecl test::identity::identity(void)(?identity @ 0test @@ YAXXZ)
1 identity.obj:错误LNK2019:未解析的外部符号void __cdecl test::identity::make(void)(?make @ identity @ test @@ YAXXZ)在函数中引用void __cdecl test::identity::identity(void)(?identity @ 0test @@ YAXXZ)
1 range.obj:错误LNK2019:未解析的外部符号void __cdecl test::range::is(void)(?是@ range @ test @@ YAXXZ)在函数中引用void __cdecl test::range::range(void)(?range @ 0test @@ YAXXZ)
链接器错误总是很难调试...但是有未解决的引用,所以我检查了......但是源代码是格式良好的......最后它击中了我:
我的文件夹层次结构如下:
src/
identity/
is.cpp
make.cpp
view.cpp
range/ …Run Code Online (Sandbox Code Playgroud) c++ visual-studio-2010 visual-studio visual-c++ visual-c++-2010
直接问题:如果我有两个具有相同名称的文件(但在不同的目录中),似乎只有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