链接选项插入在 CMakeLists(Intel OneAPI 编译器)中的 /link 关键字之前

问题描述 投票:0回答:1

由于 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 位版本中,那也非常感谢)

c++ cmake linker-errors intel-oneapi
1个回答
0
投票

应该如下配置

target_link_options(SA PUBLIC /Qoption,link,/nodefaultlib:libmmt.lib)

AFAIK

target_link_libraries
不需要。

© www.soinside.com 2019 - 2024. All rights reserved.