如何将CMake输出变为'bin'目录?

Mar*_*sen 161 c++ plugins cmake

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

Ada*_*wen 262

正如在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)
Run Code Online (Sandbox Code Playgroud)

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

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"
)
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,你可以追加_[CONFIG]到变量/属性名称,使输出目录适用于特定的配置(配置标准值是DEBUG,RELEASE,MINSIZERELRELWITHDEBINFO).

  • 您还可以通过设置RUNTIME_OUTPUT_DIRECTORY目标属性在每个目标的基础上覆盖它.请参阅此处的文档:http://cmake.org/cmake/help/cmake-2-8-docs.html#prop_tgt:RUNTIME_OUTPUT_DIRECTORY (6认同)
  • DLRdave的链接已经死了.试试http://cmake.org/cmake/help/v2.8.8/cmake.html#prop_tgt:RUNTIME_OUTPUT_DIRECTORY (4认同)
  • `CMAKE_ARCHIVE_OUTPUT_DIRECTORY` 设置静态(存档)库(Linux 上的 .a 文件)的构建位置。它不会影响“install”放置文件的位置。 (2认同)

Ole*_*leg 27

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

  • 使用目录的完整路径名作为变量值,并且不要在值中添加尾部"/"...就像Adam Bowen的回答一样. (9认同)
  • 为什么需要添加完整路径?当你移动你的项目时,这似乎是一种烦恼...... (4认同)

gti*_*kok 7

使用EXECUTABLE_OUTPUT_PATHCMake变量设置所需的路径.有关详细信息,请参阅在线CMake文档:

CMake 2.8.8文档

  • EXECUTABLE_OUTPUT_PATH现在仍然有效,但是实现此结果的"旧"方式.Adam Bowen的回答是推荐的方法. (12认同)

Jay*_*llo 6

对我而言,我使用的是 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/"
)
Run Code Online (Sandbox Code Playgroud)

但这有效(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/"
)
Run Code Online (Sandbox Code Playgroud)

  • 我将 Adam 的答案与 set (CMAKE_... 一起使用,它有效,但仅当您在添加库、可执行文件等之前这样做时才这样做。我认为这对像我这样的初学者来说是一个重要的提示。 (4认同)
  • 哇。@ashrasmun 让我在几个小时后免于发疯。在意识到这些命令的顺序非常相关之前,绝对没有任何效果。 (3认同)

mca*_*dre 5

$ cat CMakeLists.txt
project (hello)
set(EXECUTABLE_OUTPUT_PATH "bin")
add_executable (hello hello.c)
Run Code Online (Sandbox Code Playgroud)