构建托管和非托管C++;使用CMake的应用程序? 我有一个C++项目,主要是本地代码(核心库+ Windows服务)和管理C++编写的配置GUI。我已经把这个项目的大部分移植到CMake,但是我一直坚持用CGuff.构建托管C++代码。
顶级目标如下所示:构建托管和非托管C++;使用CMake的应用程序? 我有一个C++项目,主要是本地代码(核心库+ Windows服务)和管理C++编写的配置GUI。我已经把这个项目的大部分移植到CMake,但是我一直坚持用CGuff.构建托管C++代码。,cmake,managed-c++,Cmake,Managed C++,顶级目标如下所示: # Native C++ static libraries. add_library(sql STATIC ...) add_library(w32 STATIC ...) add_library(smdr STATIC ...) # Native C++ programs depending on above libraries. add_executable(logging-service ...) target_link_libraries(logging-servi
# Native C++ static libraries.
add_library(sql STATIC ...)
add_library(w32 STATIC ...)
add_library(smdr STATIC ...)
# Native C++ programs depending on above libraries.
add_executable(logging-service ...)
target_link_libraries(logging-service sql w32 smdr)
# ... more native executables here...
# Managed C++ GUI application (doesn't link with any of the above).
add_executable(configuration-editor ...)
我在CMake文档中找不到任何相关信息,我在搜索结果中看到的大多数解决方案(例如)都涉及调整CMake\u CXX\u标志*
变量。但是,这会导致其他C++项目冲突。
您如何设置生成脚本有两组C++编译器标志,一个用于本地库,另一组用于托管应用程序?< /p> < p>假设您有一些符合以下的内容:
project(my_libraries)
...
add_library(standard SHARED ${src_files})
add_library(managed SHARED ${src_files})
然后你可以做:
set(incomp_flags <list of incompatible flags>)
get_property(comp_flags TARGET managed PROPERTY COMPILE_FLAGS)
foreach(flag ${incomp_flags})
list(REMOVE_ITEM comp_flags ${flag})
endforeach()
set_property(TARGET managed PROPERTY COMPILE_FLAGS ${comp_flags} <flag for managed build>)
set(不完整标志)
获取\u属性(comp\u标志目标托管属性编译\u标志)
foreach(标志${incomp_标志})
列表(删除项目组件标志${flag})
endforeach()
set_属性(目标托管属性编译_标志${comp_标志})
其思想是,您需要获取构建托管库的标志,然后需要删除不兼容的标志并添加所需的标志 在阅读了CMake邮件列表中的各种帖子后,似乎
CMake\u CXX\u标志*
变量是每个CmakeList.txt
的本地变量,并由子目录使用add\u subdirectory()
继承
显然,拥有多组编译器标志的推荐方法是使每个设置了自己的编译器标志的同级子目录。我刚刚添加了两个文件夹
native
和managed
,每个文件夹在各自的CMakeLists.txt
中设置各自的编译器标志。现在,一切都按预期进行了构建。我不会尝试构建同一个库的两个版本。我总是同时构建本机组件和托管组件。在这两种情况下,编译器都是cl
,只是它接受不同的选项。选项<代码> /CLR < /C> >用来告诉编译器使用托管C++,这个选项与本地组件中使用的设置不兼容(例如,代码> /EHA < /C> >以允许C++异常处理和微软的SEH)。此外,CMake中默认使用了一些不兼容的选项(例如,/RTC1
)。这在您最初的问题中并不清楚——我建议对其进行编辑以使其更清楚。我用一种可能有效的方法重写了我的答案,如果用户决定以某种方式修改编译器标志,除了删除不兼容的选项外,它会保持编译器标志不变。我尝试了get\u property()
和set\u property()
组合,但它不起作用。不知何故,get\u property()
不会提取从CMAKE\u CXX\u flags
和CMAKE\u CXX\u flags\u DEBUG
继承的所有标志,因此筛选不会删除任何内容。您有什么版本的CMAKE?尝试将get\u property()
替换为get\u target\u属性(comp\u flags managed COMPILE\u flags)
。某些版本的CMake在使用get\u属性()
route时表现不佳。我使用的是CMake 2.8.7。我正在玩get_property()
和get_target_property()
游戏,当我清楚什么有效(或无效)时,我会给你回复。我刚才回答了一个类似的问题:stackoverflow.com/questions/10199904-我希望在你发布它时看到你的,我可以为你节省一些时间@弗雷泽:我只是觉得这个信息对CMake专家来说很明显,但对随意的CMake开发者来说却很难找到,这真是一件痛苦的事。不过谢谢你的链接,它证实了我的思路是正确的!