如何在windows上的cmake中添加编译标志? 我用CGEAR(NIJA和Visual Studio 2017 C++编译器)编写了一个项目,有两个模块:代码> LBYA < /COD>和 LBYB-< /COD> < /P> lib_B依赖于一个lib_A lib_B和lib_A都定义了std::vector

如何在windows上的cmake中添加编译标志? 我用CGEAR(NIJA和Visual Studio 2017 C++编译器)编写了一个项目,有两个模块:代码> LBYA < /COD>和 LBYB-< /COD> < /P> lib_B依赖于一个lib_A lib_B和lib_A都定义了std::vector,windows,visual-studio,cmake,compiler-flags,ninja,Windows,Visual Studio,Cmake,Compiler Flags,Ninja,最后,编译器告诉我:lnk2005lib\u A:std::vector已在lib\u B中定义 我搜索了答案,他们给出了添加链接标志/FORCE:MULTIPLE,和的解决方案 我都试过了,但都不管用 使用target\u link\u库 使用target\u link\u库(lib\u B lib\u A接口)/FORCE:MULTIPLE“ 编译器告诉我,接口、公共或私有选项必须作为第二个参数出现,就在目标名称之后。 使用target\u link\u库(lib\u B接口)/FORC

最后,编译器告诉我:
lnk2005lib\u A:std::vector已在lib\u B中定义

我搜索了答案,他们给出了添加链接标志
/FORCE:MULTIPLE
,和的解决方案

我都试过了,但都不管用


  • 使用
    target\u link\u库

    • 使用
      target\u link\u库(lib\u B lib\u A接口)/FORCE:MULTIPLE“
    • 编译器告诉我,
      接口、公共或私有选项必须作为第二个参数出现,就在目标名称之后。

    • 使用
      target\u link\u库(lib\u B接口)/FORCE:MULTIPLE“lib\u A)

    • 编译器告诉我,
      ninja:error:“/FORCE:MULTIPLE”,是“lib_B”所需要的,缺少并且没有已知的规则来生成它

  • 使用
    CMAKE\u EXE\u链接器\u标志
    • 使用
      set(CMAKE\u EXE\u LINKER\u FLAGS${CMAKE\u EXE\u LINKER\u FLAGS})/FORCE:MULTIPLE“
    • compile告诉我
      链接:警告LNK4012:值“x64;/FORCE:MULTIPLE”无效,必须是“ARM、EBC、HYBRID\u X86\u ARM64X64或X86”中的一个,忽略此选项“

  • 使用
    set\u target\u属性
    使用CMake代码
  • 编译器告诉我
    cl:命令行错误D8021:无效参数“/FORCE:MULTIPLE”


    若我将
    /FORCE:MULTIPLE
    更改为
    -Wl,--allow-MULTIPLE-definition
    ,编译器会告诉我类似的结果

    有人能帮我吗?
    添加链接标志是否有任何错误?

    添加以下行对我很有效:

    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /FORCE:MULTIPLE") 
    
    可以在CMake中使用≥ 3.13或使用之前的
    链接标志
    属性

    i、 e.
    target\u link\u选项(${PROJECT\u NAME}PUBLIC$)

    这也用于仅应用MSVC的标志

    但是,看起来您的两个库都是共享的(DLL),但是您正在静态地将运行时链接到这两个库。 我认为那不是个好主意


    如果要动态链接到两个库,请尝试动态链接到它们的运行时,或者使用静态运行时,但也将两个库构建为静态库。

    虽然可以工作,但使用这些全局标志有些困难antiquated@Darklighter:我们正在使用这些标志为所有项目全局设置相同的标志。但是,我将请考虑<代码> TAGTION LKKYOPTIONS/代码>作为备选。谢谢您的评论。AALPHOO代码对我不起作用。我尝试了另一种方式:用“出口”和“代码”>模板类MyStutsSTD::vector < SiZeSt> > /代码>。然后编译错误删除。顺便问一下,您的意思是<代码>静态链接运行时到两个?是否
    目标链接库(lib\u B lib\u A)
    静态链接?那么如何动态链接?@Laine我可能误解了实际问题所在。我认为您获得多个定义是由于多个标准库冲突造成的。您可能在两个库中都有同名的变量吗?不,您没有误解。我在中使用了
    typedef
    libu A
    ,并参考
    libu B
    中的
    typedef
    ed类,但msvc告诉我
    LNK1169
    ,即
    ***
    类已经在
    libu A
    中定义。最奇怪的是,两个类使用了
    typedef
    ed类,但只有一个类出现了
    LNK1169
    错误。@Laine我试图测试这样的事情不应该起作用,但是你的陈述仍然太少/不准确的信息,以判断MSVC是否错误地实例化了TyPulf的某些东西,或者如果在你的设置中有一个C++标准的POV有冲突的定义。你可以在你的问题中详细阐述所讨论的类型、变量和包含。在…上
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /FORCE:MULTIPLE")