【问题标题】:How do I make CMake output into a 'bin' dir?如何将 CMake 输出转换为“bin”目录?
【发布时间】:2011-09-29 12:04:27
【问题描述】:

我目前正在构建一个带有插件结构的项目。我正在使用 CMake 编译项目。插件在单独的目录中编译。我的问题是 CMake 将二进制文件和插件、动态库编译并保存在源的目录结构中。如何让 CMake 将文件保存在 ./bin 目录之类的目录中?

【问题讨论】:

    标签: c++ plugins cmake


    【解决方案1】:

    正如 Oleg 的回答,我相信要设置的正确变量是 CMAKE_RUNTIME_OUTPUT_DIRECTORY。我们在根 CMakeLists.txt 中使用以下内容:

    set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
    

    您还可以基于每个目标指定输出目录:

    set_target_properties( targets...
        PROPERTIES
        ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
        LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
        RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
    )
    

    在这两种情况下,您都可以将_[CONFIG] 附加到变量/属性名称以使输出目录适用于特定配置(配置的标准值为DEBUGRELEASEMINSIZERELRELWITHDEBINFO )。

    【讨论】:

    • 您也可以通过设置 RUNTIME_OUTPUT_DIRECTORY 目标属性来覆盖每个目标。请参阅此处的文档:cmake.org/cmake/help/…
    • DLRdave 的链接已失效。试试cmake.org/cmake/help/v2.8.8/…
    • 如何让它一次应用于所有配置?
    • 设置CMAKE_ARCHIVE_OUTPUT_DIRECTORY的目的是什么,考虑到命令install(TARGETS <target_name>)仍然抱怨“给定没有RUNTIME DESTINATION for executable target”?这个变量应该提供一个默认值,因此install 命令不应该抱怨缺少RUNTIME DESTINATION
    • CMAKE_ARCHIVE_OUTPUT_DIRECTORY 设置静态(归档)库(Linux 上的 .a 文件)的构建位置。它不会影响install 放置文件的位置。
    【解决方案2】:

    使用set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "/some/full/path/to/bin")

    【讨论】:

    • 使用目录的完整路径名作为变量值,并且不要在值中添加尾随“/”...就像 Adam Bowen 的回答一样。
    • 为什么需要添加完整路径?移动项目时似乎很烦人...
    • 可能将路径“/some/full/path/to/bin”更改为相对于根 CMakeLists.txt 的路径,该路径将在 ${CMAKE_SOURCE_DIR} 中设置
    【解决方案3】:

    使用EXECUTABLE_OUTPUT_PATH CMake 变量来设置所需的路径。详情请参考在线 CMake 文档:

    CMake 2.8.8 Documentation

    【讨论】:

    • EXECUTABLE_OUTPUT_PATH 现在仍然有效,但它是实现此结果的“旧”方式。 Adam Bowen 的回答是推荐的方法。
    【解决方案4】:

    就我而言,我使用的是 cmake 3.5,以下 (set variable) 不起作用:

    set(
          ARCHIVE_OUTPUT_DIRECTORY "/home/xy/cmake_practice/lib/"
          LIBRARY_OUTPUT_DIRECTORY "/home/xy/cmake_practice/lib/"
          RUNTIME_OUTPUT_DIRECTORY "/home/xy/cmake_practice/bin/"
    )
    

    但这有效(set set_target_properties):

    set_target_properties(demo5
        PROPERTIES
        ARCHIVE_OUTPUT_DIRECTORY "/home/xy/cmake_practice/lib/"
        LIBRARY_OUTPUT_DIRECTORY "/home/xy/cmake_practice/lib/"
        RUNTIME_OUTPUT_DIRECTORY "/home/xy/cmake_practice/bin/"
    )
    

    【讨论】:

    • 我将 Adam 的答案与 set (CMAKE_...跨度>
    • 哇。几个小时后,@ashrasmun 让我免于发疯。在意识到这些命令的顺序非常相关之前,绝对没有任何效果。
    • CMake 版本 3.19,这有效:set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "/some/full/path/to/bin")。您还可以指定相对于当前目录(正在执行 cmake 命令的目录)的相对路径。
    【解决方案5】:
    $ cat CMakeLists.txt
    project (hello)
    set(EXECUTABLE_OUTPUT_PATH "bin")
    add_executable (hello hello.c)
    

    【讨论】:

      【解决方案6】:

      英语不是我的母语;请原谅打字错误。

      使用这一行配置:
      set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build/)
      放置您的任何 CMakeLists.txt 项目。
      这个 ${PROJECT_SOURCE_DIR} 是您当前项目所在的源目录。
      如果徘徊为什么是 ${EXECUTABLE_OUTPUT_PATH}
      检查此文件CMakeCache.txt 然后搜索关键字output path,
      这里定义的所有变量,它会给出项目的完整解释setting·

      【讨论】:

        【解决方案7】:

        补充:

        如果您使用 CMAKE 生成 Visual Studio 解决方案,并且希望 Visual Studio 将编译后的文件输出到 /bin,则需要将 Peter 的答案修改为位:

        # set output directories for all builds (Debug, Release, etc.)
        foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} )
            string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG )
            set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_SOURCE_DIR}/lib )
            set( CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_SOURCE_DIR}/lib )
            set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_SOURCE_DIR}/bin )
        endforeach( OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES )
        

        【讨论】:

          【解决方案8】:
          cat CMakeLists.txt
          project (hello)
          set(CMAKE_BINARY_DIR "/bin")
          set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR})
          add_executable (hello hello.c)
          

          【讨论】:

          • 您能否为您的答案添加一些解释?
          【解决方案9】:

          无论我是在主 CMakeLists.txt 中还是在单独的 CMakeLists.txt 中定义它,它仍然假设我希望所有库和 bin 离开主路径,这是所有假设中最没用的假设。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-02-01
            • 2013-09-11
            • 1970-01-01
            • 2011-10-31
            • 1970-01-01
            • 2013-09-20
            相关资源
            最近更新 更多