我有一个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 ++编译器标志,一组用于本机库,另一组用于托管应用程序?
答案 0 :(得分:1)
在阅读了CMake邮件列表中的各个帖子之后,似乎CMAKE_CXX_FLAGS*
变量是每个CMakeLists.txt
的本地变量,并且使用add_subdirectory()
由子目录继承。
显然,建议使用多组编译器标志的方法是制作兄弟子目录,每个子目录都设置自己的编译器标志。我刚刚添加了两个文件夹native
和managed
,每个文件夹都在各自的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>)
这个想法是你需要获取托管库构建的标志,然后你需要删除不兼容的标志并添加你想要的那个。