Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dll 是否可以在同一个CMakeLists.txt中使用/MT和/MD设置项目?_Dll_Visual Studio 2012_Static_Cmake - Fatal编程技术网

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

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_

我有一个项目,我为它创建了库的静态和动态版本。这些工具是针对静态版本链接的,因此在最终系统上运行它们不需要特殊的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
对象固定到我需要的位置。我能做到吗?这很方便

我查看了
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()