关于 VS 2010 和 VS 2013 的警告 LNK4042
2015-01-25 12:38
127 查看
由于我最近调整了一下 Jimi 的文件结构,导致出现了一个 LNK4042 的 warning,我并没有很重视,这个 warning 导致出现了一些错误。
我调试了几个小时,一开始并没有想到是这个 warning 造成的,以为是我改代码改出来的问题(因为最近做了大量调整),特此记录一下。
我在调整代码结构的时候,出现了这么两个文件 assert.cpp 和 assert.c,之前分别叫 jimi_assert.cpp 和 jimic_assert.c,所以相安无事,
没有出现这个问题。而且由于是定义的 assert 函数,所以这个问题在 Release 版下不会有问题,在编译 Debug 版的时候才会出现,提示如下:
这会导致下面这个错误:
这是 C 里用到的 jimic_assert() 的链接错误,有时候,还会报 C++ 里的 jimi::assertion_failure() 的链接错误,
即 jimi_assert(),这两个错误出现的机率有一定随机性(只会出现一个),所以也导致我调试了几个小时……。
我们来 Google 一下 “LNK 4042”,在 CSDN 查到一个中文的:VS2010 警告 LNK4042 截图如下:
试了一下,没解决问题,继续搜,在 stackoverflow 上找到了 Visual Studio 2010's strange “warning LNK4042” ,
还有 MSDN: Linker Tools Warning LNK4042 里提到的: Visual Studio 2010 & 2008 can't handle source files with identical names in different folders? ,
原来造成这个 warning 和错误的原因是:assert.c 和 assert.cpp 生成的 obj 文件名重叠了,导致编译的时候只能链接其中一个,因为另外一个因为文件名一样被覆盖掉了。
最简单的解决办法就是让两个文件的文件名不一样,我把 assert.c 改名为 assert-c.c 后,就解决了。
但是有些时候的确是有可能在不同的文件夹下面使用相同的文件名的,所以这种方法不能一劳永逸。这个问题是因为默认的情况下,所有的 obj 都生成到同一个文件夹里,所以可以单独的指定某个文件的 obj 生成路径,这样就不会被覆盖了。在VS里选定你要改的文件,然后右键->点“属性”,示例如下:
把 对象文件名 由:Obj$(IntDir) 改为 Obj$(IntDir)\你想修改的路径 或 obj文件名,例如上图中的:Obj$(IntDir)\jimic_assert\ 或者 Obj$(IntDir)\jimic_assert.obj。、
有一点需要注意的是,最好选择“所有配置”,把 "Release" 和 "Debug" 或 其他配置都一起改了。
当然,想简单一点,还是改文件名比较快。。。
如果还有什么疑问,可以去看看那两个 stackoverflow.com 的帖子。
(完)
我调试了几个小时,一开始并没有想到是这个 warning 造成的,以为是我改代码改出来的问题(因为最近做了大量调整),特此记录一下。
我在调整代码结构的时候,出现了这么两个文件 assert.cpp 和 assert.c,之前分别叫 jimi_assert.cpp 和 jimic_assert.c,所以相安无事,
没有出现这个问题。而且由于是定义的 assert 函数,所以这个问题在 Release 版下不会有问题,在编译 Debug 版的时候才会出现,提示如下:
1>G:\Project\OpenSrc\Jimi_Root\Jimi\gen\tmp\vc2013\Jimi_static\x86-Debug\assert.obj : warning LNK4042: 对象被多次指定;已忽略多余的指定
这会导致下面这个错误:
这是 C 里用到的 jimic_assert() 的链接错误,有时候,还会报 C++ 里的 jimi::assertion_failure() 的链接错误,
即 jimi_assert(),这两个错误出现的机率有一定随机性(只会出现一个),所以也导致我调试了几个小时……。
我们来 Google 一下 “LNK 4042”,在 CSDN 查到一个中文的:VS2010 警告 LNK4042 截图如下:
试了一下,没解决问题,继续搜,在 stackoverflow 上找到了 Visual Studio 2010's strange “warning LNK4042” ,
还有 MSDN: Linker Tools Warning LNK4042 里提到的: Visual Studio 2010 & 2008 can't handle source files with identical names in different folders? ,
原来造成这个 warning 和错误的原因是:assert.c 和 assert.cpp 生成的 obj 文件名重叠了,导致编译的时候只能链接其中一个,因为另外一个因为文件名一样被覆盖掉了。
最简单的解决办法就是让两个文件的文件名不一样,我把 assert.c 改名为 assert-c.c 后,就解决了。
但是有些时候的确是有可能在不同的文件夹下面使用相同的文件名的,所以这种方法不能一劳永逸。这个问题是因为默认的情况下,所有的 obj 都生成到同一个文件夹里,所以可以单独的指定某个文件的 obj 生成路径,这样就不会被覆盖了。在VS里选定你要改的文件,然后右键->点“属性”,示例如下:
把 对象文件名 由:Obj$(IntDir) 改为 Obj$(IntDir)\你想修改的路径 或 obj文件名,例如上图中的:Obj$(IntDir)\jimic_assert\ 或者 Obj$(IntDir)\jimic_assert.obj。、
有一点需要注意的是,最好选择“所有配置”,把 "Release" 和 "Debug" 或 其他配置都一起改了。
当然,想简单一点,还是改文件名比较快。。。
如果还有什么疑问,可以去看看那两个 stackoverflow.com 的帖子。
(完)
相关文章推荐
- 关于 VS 2010 和 VS 2013 的警告 LNK4042
- 关于 VS 2010 和 VS 2013 的警告 LNK4042
- 关于VS 2010 RDLC 报表的详细使用说明
- 关于VS 2010 LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏解决方案
- VS2010(MFC)添加POPUP MENU的方法;VS2013也可以(特声明原文来自Dr.Wing 心翼的技术笔记本)
- 关于opencv2.4.9和VS2013在windows7下无法打开摄像头的问题的扯淡解决办法
- 关于VS 2013连接Microsoft Access 2013的相关问题
- 关于VS 类似 The resource "PhoneFontFamilyNormal" could not be resolved的5个警告
- 如果在VS 2010中使用 VS2013的解决方案
- VS 2010 LNK1123解决方法
- 关于VS2013调试时main带命令行参数的问题
- vs2013打开 2010项目时: 请确认 <Import> 声明中的路径正确,且磁盘上存在该文件
- 关于在VS 2013 Reshaper 中不能使用Alt+Enter 的解决
- 如果在VS 2010中使用 VS2013的解决方案
- VS2010错误: LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 vsLNK1123 转换到 COFF 期间失
- 如何在VS 2010中使用 VS2013的解决方案
- c#学习中关于vs 2010遇到的中文注释,解决方案管理等器问题
- 关于VS "error LNK2005: 已经在 .obj 中定义"
- 关于vs2013调试的偶然错误发现与总结(vs2013的承载进程)---ShinePans
- 关于VS 2010 LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏解决方案