在同一个CMakeLists.txt中,是否可以使用/ MT和其他用/ MD设置项目?

时间:2013-08-05 18:37:58

标签: dll visual-studio-2012 static cmake

我有一个项目,我为其创建了一个静态和动态版本的库。这些工具与静态版本链接,因此在最终系统上运行它们不需要特殊的DLL。

我可以设置整个所有内容,使用/ MD/MT(以及相应的调试)使用根CMakeLists.txt中的一个简单集进行编译。

例如,要强制/ MT我可以使用以下内容:

set ( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT" )
set ( CMAKE_C_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT" )
set ( CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_RELEASE} /MTd" )
set ( CMAKE_C_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_RELEASE} /MTd" )

但是,这意味着使用/MT编译动态库是错误的。是否有可能在每个项目的基础上做同样的事情?毕竟,一旦创建了解决方案,我就可以编辑每个项目并将/MD/MT对象修复为我需要的对象。 cmake能做到吗?这会很方便。

我查看了set_target_properties(),但似乎没有采用CMAKE_C_FLAGS_<type>变量,如果我只是设置了一组标准的标志,那么它就不会特定于Debug或Release。

以下设置了属性,但我似乎没有选择调试和发布选项。

set_target_properties( ${PROJECT_NAME} PROPERTIES
    COMPILE_FLAGS "/MT"
)

任何解决方案?

1 个答案:

答案 0 :(得分:4)

嘛!我搞定了!

我发现这个问题有一个糟糕的解决方案,将库拆分为两个目录并在每个目录中都有set()。这可行,但这将是相当多的工作。

How can I set specific compiler flags for a specific target in a specific build configuration using CMake?

该解决方案的评论中包含此问题的链接:

http://public.kitware.com/Bug/view.php?id=6493

实际上只是在2013-06-03 12:52标记为已修复!这意味着该解决方案尚未在最新的稳定版cmake中提供。然而,Brad King和Stepen Kelly所做的工作确实很有效。它可以从这里的每日构建中下载:

http://www.cmake.org/files/dev/?C=M;O=D

使用新命令的方法有点棘手,我写的是:

function(StaticCompile)
    target_compile_options( ${PROJECT_NAME}
        PUBLIC "/MT$<$<STREQUAL:$<CONFIGURATION>,Debug>:d>"
    )
endfunction()

其中英文表示:如果字符串“$&lt; CONFIGURATION&gt;”等于“Debug”然后在“/ MT”之后输出“d”,否则不输出任何内容。

然后,在我有一个需要用/ MT或/ MTd编译的目标的任何地方,我都使用以下命令:

project(wpkg)

add_executable( ${PROJECT_NAME}
    wpkg.cpp
    license.cpp
)

StaticCompile()

结果完全符合预期,没有任何目录或其他技巧!

它适用于我的版本cmake-2.8.11.20130803-gd5dc2-win32-x86.exe,这是今天可用的。真的很酷! 8 - )