关于 VS 2010 和 VS 2013 的警告 LNK4042

  由于我最近调整了一下 Jimi 的文件结构,导致出现了一个 LNK4042 的 warning,我并没有很重视,这个 warning 导致出现了一些错误。

我调试了几个小时,一开始并没有想到是这个 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 的帖子。

(完)

时间: 2024-10-10 17:23:08

关于 VS 2010 和 VS 2013 的警告 LNK4042的相关文章

SharePoint 2010 升级到2013时间 为了确保用户可以连接,但无法改变升级数据

SharePoint 2010 升级到2013时间 为了确保用户可以连接,但无法改变升级数据 我总结的步骤 红色请注意它们的含义. 步骤1:连接到SQL DBS 上的SharePoint 2010数据库的内容. 步骤2:设置SharePoint内容数据库的仅仅读状态为True. 步骤3:把SharePoint 2010内容数据库备份文件恢复到SharePoint 2013场. 步骤4:SharePoint内容数据库的仅仅读状态设置为False(读写). 步骤5:分离SharePoint 2010

SharePoint 2010 升级到2013时 保证用户能够连接但不能修改正升级的数据

SharePoint 2010 升级到2013时 保证用户能够连接但不能修改正升级的数据 我总结的步骤 红色请注意他们的意义. 步骤1:连接到SQL DBS 上的SharePoint 2010数据库的内容. 步骤2:设置SharePoint内容数据库的只读状态为True. 步骤3:把SharePoint 2010内容数据库备份文件恢复到SharePoint 2013场. 步骤4:SharePoint内容数据库的只读状态设置为False(读写). 步骤5:分离SharePoint 2010内容数据

Sharepoint 2010、Sharepoint 2013浏览器打开CAD(.dwg)

客户端配置 1.安装FreeDWGViewer.exe,设置浏览器查看 2.检查ActiveX插件是否已安装成功 服务端配置 1.开启许可模式或者通过脚本将"application/acad"加入InlineDownloadedMimeTypes 或者 参考http://www.captechconsulting.com/blog/brandon-atkinson/allowing-pdfs-open-browser-sharepoint-2010-the-right-way $web

XP-office 2007/2010 连接Exchange 2013

最近遇到了个问题,客户的环境从03迁移到了13,但是客户端仍然停留在XP的环境下,然后,悲剧的就来了,XP上的Office在连接Exchange 2013的时候每次登录的时候弹密码框,或者在配置的时候一直弹密码框. 查询了网上的很多资料,什么改注册表,改outlookprovider,都没能实际解决问题,后来经过诸多测试,其实发现只需要改几个地方就可以了! 本人的测试环境借用的别人的Exchange 2013 CU8,客户端:windows XP SP3+office 2010 SP2:wind

Lync 2010迁移Lync 2013部署后前端服务无法启动处理案例

Lync Server 2013部署后,前端服务无法启动,准备删除拓扑,删除Lync组件,删除AD域架构准备,删除ADSI架构. 当时的操作步骤如下,有点粗糙,供参考: 1.Remove-CsConferenceDirectory -Identity 3 -force 2.拓扑中删除Lync Server 2013部署 3.发布拓扑 3.删除Lync 组件 4.Stop-CsWindowsService 5.C:\Program Files\Microsoft Lync Server 2013\

从exchange 2007 或2010升级到2013之传输规则迁移

很多企业在使用Exchange2007或2010邮件系统时,都做了一些邮件流的策略,比如:组织外部的发件人进来的邮件转发给组织内的某人或者收件人是谁的邮件需要经过某人审批等等- - 这些邮件流规则,我们在做邮件系统升级的时候是不会自动将这些策略迁移过去的,需要我们手动进行,下面是手动执行的过程: 1. 打开exchange2007 或2010 EMS命令行窗口,执行以下命令获取并导出传输策略: get-TransportRule(获取传输策略) Export-TransportRuleColle

36Exchange 2010升级到Exchange 2013-登陆OWA&ECP以及强制登陆到2013界面

17.3 登陆ECP和OWA测试 17.3.1 登陆ECP 下面输入下Exchange 2013的ECP URL,https://ex11.robin.com/ecp 点击登陆后,可以看到重定向到了EX2010的面板 17.3.2 登陆OWA 登陆后会重定向到Exchange 2010的OWA界面 17.3.3 强制登陆到EX2013 ECP 那么可以使用如下的URL强行登陆到Exchange 2013的面板,URL为: 输入https://ex11.robin.com/ecp/?ExchCli

ansible远程在Windows server 2012 R2 安装vcredist(2008 2010 2012 2013)

需求: 远程在windows server 2012 R2上安装vcredist 2008, 2010, 2012和2013 四个版本. 首先在ansible的官方文档找了一下看有没有适合的模块直接能使用的. 最开始找到的是win_package模块: http://docs.ansible.com/ansible/win_package_module.html ,同时看到它给出来的例子. 感觉可以直接拿来就用啊.把path路径换成要安装的exe 放置的本地路径,不就可以了吗? 后来发现,win

Sharepoint 2010升级至 2013

最近做了一个客户的sharepoint升级项目,这里做个简单的share 关于sharepoint 2010升级到2013,网络上也有很多的文章,但是对于sharepoint不是特别熟悉的人来说,升级总是会有怕怕的感觉. 所以备份很重要,就算失败了也能重来啊,除非你经验丰富,能解决各种突发情况. 现场的环境是这样的: 一台 sharepoint 2010 一台  sql 2008 r2 sp1 一台sharepoint 2013 当然,这不是官方推荐的做法,当初是被迫节省时间,所以不做数据库的迁