使用CMake构建托管和非托管C ++应用程序?

时间:2012-04-15 23:44:20

标签: cmake managed-c++

我有一个C ++项目,主要是本机代码(核心库+ WIndows服务)和用托管C ++编写的配置GUI。我已将此项目的大部分内容移植到CMake,但我仍然坚持使用CMake构建托管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-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文档中找不到任何相关信息,我在搜索结果中看到的大多数解决方案(例如messages in the mailing list)都涉及调整CMAKE_CXX_FLAGS*变量。但是,这会与其他C ++项目产生冲突。

如何设置构建脚本以具有两组C ++编译器标志,一组用于本机库,另一组用于托管应用程序?

2 个答案:

答案 0 :(得分:1)

在阅读了CMake邮件列表中的各个帖子之后,似乎CMAKE_CXX_FLAGS*变量是每个CMakeLists.txt的本地变量,并且使用add_subdirectory()由子目录继承。

显然,建议使用多组编译器标志的方法是制作兄弟子目录,每个子目录都设置自己的编译器标志。我刚刚添加了两个文件夹nativemanaged,每个文件夹都在各自的CMakeLists.txt中设置了自己的编译器标志。现在,everthing按预期构建。

答案 1 :(得分:0)

假设你有以下几点:

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

这个想法是你需要获取托管库构建的标志,然后你需要删除不兼容的标志并添加你想要的那个。