1

我有一个 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 文档中找不到任何相关信息,而且我在搜索结果中看到的大多数解决方案(例如邮件列表中的消息)都涉及调整CMAKE_CXX_FLAGS*变量。但是,这会与其他 C++ 项目产生冲突。

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

4

2 回答 2

2

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

显然,拥有多组编译器标志的推荐方法是创建兄弟子目录,每个子目录都设置自己的编译器标志。我刚刚添加了两个文件夹nativemanaged并且每个文件夹都在各自的CMakeLists.txt. 现在,一切都按预期构建。

于 2012-04-17T23:29:42.963 回答
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>)

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

于 2012-04-16T00:04:02.723 回答