Windows 上的 cmake RUNTIME_OUTPUT_DIRECTORY

问题描述 投票:0回答:9

我正在使用 来管理我的跨平台构建,除了这个问题之外,我已经解决了所有问题。我将

RUNTIME_OUTPUT_DIRECTORY
设置为存储数据文件的
bin/
目录。在 Linux 上,这工作得很好。在 Windows 上,根据构建类型,可执行文件被放置在
Debug
/
Release
子目录中。有什么方法可以让 将可执行文件复制到正确的目录,或者(甚至更好)完全停止使用这些子目录?

visual-studio build-process cross-platform cmake
9个回答
22
投票

多年来我一直在使用 Ogapo 报告的精细前缀属性 hack。它有效。

但从 CMake 2.8 版本开始,官方支持避免在 Windows 上使用 Release/Debug 子目录。

使用全局

CMAKE_<ARTIFACT>_OUTPUT_DIRECTORY_<CONFIGURATION>
变量,或每个目标
<ARTIFACT>_OUTPUT_DIRECTORY_<CONFIGURATION>
属性,如下所示:

SET( CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${OUTPUT_DIRECTORY}")
SET( CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${OUTPUT_DIRECTORY}")
SET( CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${OUTPUT_DIRECTORY}")
SET( CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE "${OUTPUT_DIRECTORY}")
SET( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${OUTPUT_DIRECTORY}")
SET( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${OUTPUT_DIRECTORY}")

12
投票

我不确定这些目录是故意的还是错误,但冒着向前不兼容的风险,您可以添加:

if (MSVC_IDE)
    # hack to get around the "Debug" and "Release" directories cmake tries to add on Windows
    set_target_properties (${NAME} PROPERTIES PREFIX "../")
endif()

这对我很有用


1
投票

我发现了一些关于这个主题的很好的讨论:

http://www.cmake.org/pipermail/cmake/2008-April/021355.html

http://www.vtk.org/Bug/bug_view_advanced_page.php?bug_id=8366

是否可以使用已弃用的 EXECUTABLE_OUTPUT_PATH 代替 RUNTIME_OUTPUT_DIRECTORY?我不确定两者之间的功能发生了哪些变化,但可能值得一试。


1
投票

一些 cmake 变量具有构建特定版本。

CMAKE_C_FLAGS 
    the compiler flags for compiling C sources. Note you can also specify switches with ADD_DEFINITIONS(). 
CMAKE_C_FLAGS_DEBUG 
    compiler flags for compiling a debug build from C sources. 
CMAKE_C_FLAGS_RELEASE 
    compiler flags for compiling a release build from C sources. 
CMAKE_C_FLAGS_RELWITHDEBINFO 
    compiler flags for compiling a release build with debug flags from C sources. 

我尚未验证这些变量是否存在,但也许将

RUNTIME_OUTPUT_DIRECTORY_DEBUG
&&
RUNTIME_OUTPUT_DIRECTORY_RELEASE
设置为相同的值可能会起作用。


1
投票

到目前为止,我找到的最佳答案是简单地为每个目标和数据文件编写 CMake 安装命令,并将 MSVC 调试器设置为在安装目录之外运行。这具有使用 CPack 创建安装程序的额外好处。


1
投票

对我来说是全球性的:

set(CMAKE_STATIC_LIBRARY_PREFIX "../lib")
set(CMAKE_SHARED_LIBRARY_PREFIX "../lib")

完成了工作,所以我不必为每个库设置它(CMake 2.8.4)


1
投票

现在有一个简单的解决方案。 cmake 说:

多配置生成器(Visual Studio、Xcode、Ninja Multi-Config)将每个配置的子目录附加到指定的 目录,除非使用生成器表达式。

所以我们可以使用生成器表达式。像下面这样:

set_target_properties(foo PROPERTIES ARCHIVE_OUTPUT_DIRECTORY $<1:${PROJECT_SOURCE_DIR}/lib>)
set_target_properties(foo PROPERTIES LIBRARY_OUTPUT_DIRECTORY $<1:${PROJECT_SOURCE_DIR}/lib>)
set_target_properties(foo PROPERTIES RUNTIME_OUTPUT_DIRECTORY $<1:${PROJECT_SOURCE_DIR}/bin>)

如果你想放入配置目录,请使用这个:

set_target_properties(foo PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/output/$<CONFIG>/lib)
set_target_properties(foo PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/output/$<CONFIG>/lib)
set_target_properties(foo PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/output/$<CONFIG>/bin)

0
投票

hgyxbll 的答案在全球范围内为我工作(针对所有目标)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY $<1:${PROJECT_SOURCE_DIR}/bin>)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY $<1:${PROJECT_SOURCE_DIR}/bin>)

-5
投票

您需要更改 Visual Studio 项目的构建位置。转到“项目属性”,然后在“编译”选项卡上将“构建输出路径”指定为您希望的任何位置。

注意

不知道这有多相关,因为我不了解 CMake。

您可以在 Visual Studio 构建事件中使用以下令牌:

$(TargetPath)

这将是您的项目构建位置的路径,因此根据您的项目设置,这将是“调试”或“发布”文件夹。

© www.soinside.com 2019 - 2024. All rights reserved.