繁体   English   中英

在 CMake 中,如何解决 Visual Studio 2010 尝试添加的调试和发布目录?

[英]In CMake, how do I work around the Debug and Release directories Visual Studio 2010 tries to add?

我正在尝试使用 Visual Studio 2010 从几年前构建我的一个基于 CMake 的项目,但我遇到了与项目的输出目录有关的问题。 Visual Studio 一直非常热衷于在输出二进制文件时添加 Debug/ 和 Release/ 子目录,出于各种原因,我一直非常热衷于删除它们——现在我正在使用新版本的 CMake 和新版本的Visual Studio,CMake 中的旧解决方法似乎不再有效,我正在寻找“新”的方法。

使用以前版本的 CMake (2.6) 和以前版本的 Visual Studio (2008),我使用了以下内容:

IF(MSVC_IDE)
    # A hack to get around the "Debug" and "Release" directories Visual Studio tries to add
    SET_TARGET_PROPERTIES(${targetname} PROPERTIES PREFIX "../")
    SET_TARGET_PROPERTIES(${targetname} PROPERTIES IMPORT_PREFIX "../")
ENDIF(MSVC_IDE)

这工作得很好,但似乎不再奏效了。 请问有谁知道类似但更新的解决方法可以与 CMake 2.8.6 和 Visual Studio 2010 一起使用?

这取决于您要精确地确定什么,但是我建议您看一下与该问题类似的可用目标属性

这取决于您到底想要什么。 对于每个目标,您可以手动设置library_output_directoryruntime_output_directory属性。

if ( MSVC )
    set_target_properties( ${targetname} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${youroutputdirectory} )
    set_target_properties( ${targetname} PROPERTIES LIBRARY_OUTPUT_DIRECTORY_DEBUG ${youroutputdirectory} )
    set_target_properties( ${targetname} PROPERTIES LIBRARY_OUTPUT_DIRECTORY_RELEASE ${youroutputdirectory} )
    # etc for the other available configuration types (MinSizeRel, RelWithDebInfo)
endif ( MSVC )

您还可以使用以下方法对所有子项目全局执行此操作:

# First for the generic no-config case (e.g. with mingw)
set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${youroutputdirectory} )
set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${youroutputdirectory} )
set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${youroutputdirectory} )
# Second, for multi-config builds (e.g. msvc)
foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} )
    string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG )
    set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${youroutputdirectory} )
    set( CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${youroutputdirectory} )
    set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${youroutputdirectory} )
endforeach( OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES )

在当前版本的CMake中,可以为LIBRARY_OUTPUT_DIRECTORY使用生成器表达式来避免特定于配置的后缀。

我刚刚添加了$<$<CONFIG:Debug>:> ,它总是扩展为零。 这看起来有点不可思议,但是它确实有效,而且也并非如此,您不能用简短的注释来解释它:

# Use a generator expression so that the specified folder is used directly, without any
# configuration-dependent suffix.
#
# See https://cmake.org/cmake/help/v3.8/prop_tgt/LIBRARY_OUTPUT_DIRECTORY.html
set_target_properties(library PROPERTIES
                      LIBRARY_OUTPUT_DIRECTORY my/folder/$<$<CONFIG:Debug>:>)

https://cmake.org/cmake/help/latest/prop_tgt/LIBRARY_OUTPUT_DIRECTORY.html解释说:

除非使用生成器表达式,否则多配置生成器(VS,Xcode)会将每个配置的子目录追加到指定目录。

因此,唯一的解决方法是使用生成器表达式。 一种很酷的方法是在路径末尾使用$ <0:>。 因此,如果您的路径是/ what / ever /,则需要将其替换为/ what / ever / $ <0:>。

目标示例:Nuua,路径:C:/ Nuua / bin /

set_target_properties(nuua PROPERTIES RUNTIME_OUTPUT_DIRECTORY C:/Nuua/bin/$<0:>)

非常感谢 Erik 提示使用 $<0:>

如果您有多个目标需要该解决方案,则可以执行以下操作

# Get Targets in ${CMAKE_CURRENT_SOURCE_DIR}
get_property(current_targets DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY BUILDSYSTEM_TARGETS)
foreach(TARGET ${current_targets})
    set_target_properties(${TARGET} PROPERTIES
                        RUNTIME_OUTPUT_DIRECTORY  ${CMAKE_BINARY_DIR}/$<0:> 
                        LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/$<0:>
                        ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/$<0:>)
endforeach()

为 ${CMAKE_CURRENT_SOURCE_DIR} 中的所有目标执行它,而无需为每个可执行文件/库单独添加它

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM