代码之家  ›  专栏  ›  技术社区  ›  T. J. Evers

在CMakeLists(英特尔OneAPI编译器)中,链接选项插入在/Link关键字之前

  •  0
  • T. J. Evers  · 技术社区  · 1 年前

    由于liburctd.lib和libmmt.lib之间的冲突,我收到了一个链接器错误。为什么我会得到这个是另一个问题。

    在试图弄清楚这一点时,我想看看设置/NODEFAULTLIB(或-nodefaultib)是否有效。

    我尝试了三种不同的添加方式(使用三个不同的库来区分错误,斜线/破折号/大写字母/引号都没有区别):

    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  ...
    

    我在某个地方读到过这样一句话:nodefaultib是一个需要出现的标志 之后 /link

    事实上,使用以下命令手动运行该命令 -nodefaultlib:libmmt.lib 之后 /链接 让我的程序链接很好!

    发生了什么,为什么会发生,我做错了什么?

    昨天我一直在寻找4个小时的大部分时间,但无论如何都找不到 任何东西 关于这件事。


    (如果有人能解决我的链接器错误,奇怪的是,这种错误发生在我的32位调试版本中,但在我的64位版本中没有,我们也非常感激)

    1 回复  |  直到 1 年前
        1
  •  2
  •   3CxEZiVlQ    1 年前

    它应该按如下方式配置,正如您在问题中显示的其他链接器选项。

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

    就我所知 target_link_libraries 如图所示,不需要,否则该选项将重复。

    推荐文章