3

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

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

例如,要强制 /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"
)

有什么解决办法吗?

4

1 回答 1

5

出色地!我让它工作了!

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

如何使用 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()

这在英文中的意思是:如果字符串“$<CONFIGURATION>”等于“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-)

于 2013-08-05T21:52:12.060 回答