【问题标题】:cmake RUNTIME_OUTPUT_DIRECTORY on Windowscmake RUNTIME_OUTPUT_DIRECTORY 在 Windows 上
【发布时间】:2010-10-07 06:59:03
【问题描述】:

我正在使用 来管理我的跨平台构建,除了这个问题,我已经解决了所有问题。我将RUNTIME_OUTPUT_DIRECTORY 设置为存储数据文件的bin/ 目录。在 Linux 上,这可以正常工作。在 Windows 上,可执行文件根据构建类型放置在 Debug/Release 子目录中。有没有办法让 将可执行文件复制到正确的目录,或者(甚至更好)完全停止使用这些子目录?

【问题讨论】:

  • 我假设您正在使用 cmake 生成 Visual Studio 解决方案/项目文件,对吗?使用什么版本的 Visual Studio?什么版本的cmake?
  • 是的,我正在使用 CMake 生成解决方案文件(cmake 2.6,VS 2005)

标签: cmake cmake visual-studio build-process cross-platform cmake


【解决方案1】:

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

但从 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}")

【讨论】:

  • 我还没有四处寻找解决方案。并遇到了这个答案,同时我找到了这个链接:cmake.org/Bug/view.php?id=9163。这个答案使用完全相同的技术。我认为这个答案是迄今为止最好的解决方案。对我来说效果很好。谢谢。
【解决方案2】:

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

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()

这对我有用

【讨论】:

  • 这对我来说也很好。对于 .lib 文件,使用 SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES IMPORT_PREFIX "../")
【解决方案3】:

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

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?我不确定两者之间的哪些功能发生了变化,但可能值得一试。

【讨论】:

    【解决方案4】:

    一些 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 设置为相同的值可能会起作用。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        对我来说是一个全球性的:

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

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

        【讨论】:

          【解决方案7】:

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

          注意

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

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

          $(TargetPath)

          这将是构建项目的位置的路径,因此根据您的项目设置,这将是 Debug 或 Release 文件夹。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-05-05
            • 2016-06-22
            • 2015-06-12
            • 2018-10-23
            • 2017-09-25
            • 2021-01-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多