由于 liburctd.lib 和 libmmt.lib 之间存在冲突,我收到链接器错误。为什么我会得到这个完全是另一个问题。
在试图弄清楚这一点时,我想看看仅设置 /NODEFAULTLIB (或 -nodefaultlib)是否有效。
我尝试了三种不同的添加方式(使用三个不同的库来区分错误,斜线/破折号/大写/引号都没有区别):
set_target_properties(SA PROPERTIES LINK_FLAGS -nodefaultlib:libcmt.lib)
target_link_options(SA PUBLIC -nodefaultlib:libmmt.lib)
target_link_libraries(SA PUBLIC -nodefaultlib:liburctd.lib)
使用详细命令运行向我展示:
LINK: command "C:\PROGRA~2\Intel\oneAPI\compiler\latest\bin\icx.exe /nologo @CMakeFiles\SA.rsp /Qoption,link,/machine:X86 /Qoption,link,/debug /Qoption,link,/INCREMENTAL /Qoption,link,/subsystem:console -nodefaultlib:libcmt.lib -nodefaultlib:libmmt.lib /link /out:SA.exe /implib:SA.lib /pdb:SA.pdb /version:0.0 /MANIFEST:EMBED,ID=1" failed (exit code 1169) with the following output:
icx: warning: unknown argument ignored in clang-cl: '-nodefaultlib:liburctd.lib' [-Wunknown-argument]
icx: warning: unknown argument ignored in clang-cl: '-nodefaultlib:libcmt.lib' [-Wunknown-argument]
icx: warning: unknown argument ignored in clang-cl: '-nodefaultlib:libmmt.lib' [-Wunknown-argument]
libucrtd.lib(log_impl.obj) : error LNK2005: __CIlog already defined in libmmt.lib(log_iface_c99.obj)
libucrtd.lib(pow_impl.obj) : error LNK2005: __CIpow already defined in libmmt.lib(pow_iface_c99.obj)
重点关注命令的重要部分:
... -nodefaultlib:libcmt.lib -nodefaultlib:libmmt.lib /link /out:SA.exe ...
我在某处读到 -nodefaultlib 是一个需要在after
/link
出现的标志
事实上,使用
-nodefaultlib:libmmt.lib
after /link
手动运行命令可以使我的程序链接正常!
发生了什么,为什么会发生,我做错了什么?
昨天我一直在寻找 4 个小时的大部分时间,但我一生都找不到关于此的任何东西。
(如果有人对我的链接器错误有解决方案,奇怪的是,该错误发生在我的 32 位调试版本中,但没有出现在我的 64 位版本中,那也非常感谢)
应该如下配置
target_link_options(SA PUBLIC /Qoption,link,/nodefaultlib:libmmt.lib)
AFAIK
target_link_libraries
不需要。