我有一个CMakeLists,我想建立一个使用C运行时的动态版本使用静态版本的一些目标,和其他一些目标。
因此需要每个目标被设定,设定的默认方法CMAKE_CXX_FLAGS_<Config>
不工作; 这将覆盖所有目标。
为此,我试过类似如下:
# @fn set_target_dynamic_crt
# @brief Sets the given target to use the dynamic version of the CRT (/MD or
# /MDd)
# @param ... A list of targets to which this setting should be applied.
function( set_target_dynamic_crt )
if ( MSVC )
message (WARNING ${CMAKE_BUILD_TYPE})
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
set_target_properties ( ${ARGN} PROPERTIES COMPILE_FLAGS "/MDd" )
else()
set_target_properties ( ${ARGN} PROPERTIES COMPILE_FLAGS "/MD" )
endif()
endif()
endfunction()
然而,这总是选择发行版本( /MD
),当我查询生成类型(的message
上述电话)我得到一个空字符串。 (我怀疑这是因为我使用Visual Studio生成;我见过不止一个参考,说CMAKE_BUILD_TYPE
仅用于生成文件...)
如何设置这样进行编译每个目标的选择吗?
在CMake的2.8.12我加了target_compile_options命令来满足这一需求:
http://public.kitware.com/Bug/view.php?id=6493
http://www.cmake.org/cmake/help/git-master/manual/cmake-generator-expressions.7.html
target_compile_options(tgt PRIVATE "/MD$<$<CONFIG:Debug>:d>")
看到
http://www.cmake.org/cmake/help/git-next/manual/cmake-buildsystem.7.html#build-specification-with-generator-expressions
对于更多关于CMAKE_BUILD_TYPE和几个原因发生器表达是更好(例如IMPORTED目标配置映射)。
我知道这个方案是你的项目拆分成子目录在每个目标的基础,并使用唯一的选择add_subdirectory
。
根据项目目前是如何设置,这可能是一个痛苦的过程,我想。
其结果将是一个看起来像如顶级的CMakeLists.txt
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(Test)
add_subdirectory(libB)
add_subdirectory(libA)
add_executable(main_exe "main.cpp")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd")
target_link_libraries(main_exe lib_a lib_b)
然后libA/CMakeLists.txt
可以指定MD
和MDd
标志:
project(LibA)
add_library(lib_a a.cpp a.hpp)
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd")
和libB/CMakeLists.txt
为MT
和MTd
标志:
project(LibB)
add_library(lib_b b.cpp b.hpp)
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
当然,你可以添加所有·需要的目标链接到一个子目录的CMakeLists.txt和所有其他动态CRT那些静态CRT如果你有很多的目标。
CMAKE_BUILD_TYPE
仅适用于配置单生成。 多配置发生器(MSVC和Xcode中)可以构建用于在一个集结目录多种配置并且这样CMAKE_BUILD_TYPE
标志不会有含义。
所述COMPILE_FLAGS目标属性不区分不同的配置(参见kitware错误追踪系统的更多信息)。
一个解决办法是有两个集结目录,类似于人们如何使用Makefile发电机,并建立二进制分发当定义一个额外的标志。 (即,发布配置)
文章来源: How can I set specific compiler flags for a specific target in a specific build configuration using CMake?