如何在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")