Dll 是否可以在同一个CMakeLists.txt中使用/MT和/MD设置项目?
我有一个项目,我为它创建了库的静态和动态版本。这些工具是针对静态版本链接的,因此在最终系统上运行它们不需要特殊的DLL 我可以通过根CMakeLists.txt中的一个简单设置,设置所有要用/Dll 是否可以在同一个CMakeLists.txt中使用/MT和/MD设置项目?,dll,visual-studio-2012,static,cmake,Dll,Visual Studio 2012,Static,Cmake,我有一个项目,我为它创建了库的静态和动态版本。这些工具是针对静态版本链接的,因此在最终系统上运行它们不需要特殊的DLL 我可以通过根CMakeLists.txt中的一个简单设置,设置所有要用/MD或/MT编译的内容(以及相应的调试) 例如,要强制/MT,我可以使用以下命令: set ( CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT" ) set ( CMAKE_C_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_
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
对象固定到我需要的位置。我能做到吗?这很方便
我查看了set\u target\u properties()
,但这似乎没有考虑CMAKE\u C\u FLAGS\u
变量,如果我只设置了一组标准的标志,那么它将不会特定于调试或发布
下面确实设置了属性,但我似乎没有调试和发布选项的选择
set_target_properties( ${PROJECT_NAME} PROPERTIES
COMPILE_FLAGS "/MT"
)
有什么解决办法吗?好吧!我让它工作了 我发现这个问题有一个糟糕的解决方案,将库拆分为两个目录,并在每个目录中设置set()。那是可行的,但这将是一个相当大的工作量 该解决方案有一条与此问题相关的评论: 这实际上是在2013-06-03 12:52被标记为固定的!这意味着该解决方案尚未在最新稳定版本的cmake中提供。然而,布拉德·金和斯捷潘·凯利所做的工作确实很好。可从以下每日版本下载: 使用新命令的方法有点棘手,下面是我写的:
function(StaticCompile)
target_compile_options( ${PROJECT_NAME}
PUBLIC "/MT$<$<STREQUAL:$<CONFIGURATION>,Debug>:d>"
)
endfunction()
结果完全符合预期,没有任何目录或其他技巧
对于我来说,cmake-2.8.11.20130803-gd5dc2-win32-x86.exe版本是目前可用的版本。真的很酷!8-不要使用STREQUAL。改为使用配置生成器表达式。你敢用这个所谓的“配置生成器”回答吗?@AlexisWilke,请参阅$in应该类似于
“/MT$”
(警告:未测试)
project(wpkg)
add_executable( ${PROJECT_NAME}
wpkg.cpp
license.cpp
)
StaticCompile()