VS2022 Debug模式构建CUDA C++代码出现LNK4098链接警告如何解决
问题根因
CUDA 11.7的VS项目模板自带的构建规则,会在Debug x64配置下硬编码注入/MT(静态发布版CRT)的主机编译参数,这个参数优先级比你在C/C属性页手动设置的运行时选项高,不管你选/MTd还是/MDd,都会和CUDA规则注入的CRT选项冲突,触发LNK4098警告,和你本身的C/C运行时配置对错无关。
解决步骤
- 右键项目,依次打开【生成依赖项】-【生成自定义】,确认已勾选CUDA 11.7的生成规则,点击确定保存。
- 打开项目属性页,顶部配置栏选中
Debug、平台选中x64,找到【CUDA C/C++】-【主机】设置项。 - 找到分类下的【运行时库】选项,将默认的
/MT修改为和你C/C++代码运行时配置完全一致的值:如果项目全局用动态调试CRT就选/MDd,用静态调试CRT就选/MTd。 - 切换到【链接器】-【输入】设置页,检查【附加依赖项】列表,删除所有手动硬编码添加的
libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib条目;同时清空【忽略特定默认库】里之前为了消警告乱加的配置项。 - 关闭属性页,右键解决方案选择【清理解决方案】,手动删除项目目录下的
x64/Debug中间生成文件夹,重新构建即可。
残留警告处理
如果完成上述操作后警告仍然存在,说明你链接的第三方静态库采用的CRT配置和项目不匹配:
打开VS 2022的x64原生工具命令提示符,进入第三方库存放路径,执行
lib /list 第三方库名.lib,查看库内引用的CRT标记:名称带d后缀为调试版,libcmt前缀为静态CRT,msvcrt前缀为动态CRT,必须将所有依赖库的CRT编译选项和项目、CUDA编译选项对齐,才能彻底消除冲突。
如果只是临时屏蔽不影响功能的警告(不推荐长期使用,优先统一配置),可以在【链接器】-【命令行】的附加参数栏添加对应忽略规则:使用/MDd时加/NODEFAULTLIB:libcmt.lib,使用/MTd时加/NODEFAULTLIB:msvcrtd.lib。
内容的提问来源于stack exchange,提问作者user3134182
相关产品推荐
相关产品推荐

