如何将CMake输出转换为“ bin”目录?


187

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

Answers:


299

就像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)。


8
您还可以通过设置RUNTIME_OUTPUT_DIRECTORY目标属性来逐个目标覆盖此属性。在这里看到的文档:cmake.org/cmake/help/...
DLRdave

4
DLRdave的链接已死。尝试cmake.org/cmake/help/v2.8.8/...
Nicu的Stiurca

如何使其一次应用于所有配置?
埃莱2015年

前三个命令应适用于所有配置(特别是设置CMAKE_RUNTIME_OUTPUT_DIRECTORY)。例如,如果要为调试输出使用其他目录,则仅设置CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG。确切的行为取决于您使用的生成器/工具链(例如,Visual Studio项目文件将所有配置都包含在一个生成树中,而makefile生成器将仅生成一个生成配置的makefile)。
亚当·鲍恩

1
CMAKE_ARCHIVE_OUTPUT_DIRECTORY考虑到命令install(TARGETS <target_name>)仍然抱怨“给可执行目标没有RUNTIME DESTINATION” ,设置的目的是什么?该变量应该提供默认值,因此该install命令不应抱怨缺少a RUNTIME DESTINATION
thiagowfx

30

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


10
使用目录的完整路径名作为变量值,并且不要在值末尾加上“ /” ...就像亚当·鲍文的答案一样。
DLRdave

4
为什么需要添加完整路径?当您移动项目时,这似乎很
烦人

8

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

CMake 2.8.8文档


15
EXECUTABLE_OUTPUT_PATH现在仍然可以使用,但这是实现此结果的“旧”方法。Adam Bowen的答案是推荐的方法。
DLRdave 2011年

4

对于我来说,我使用的是cmake 3.5,但below(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/"
)

2
我使用了Adam的set(CMAKE _...)答案,它可以工作,但仅当您在添加库,可执行文件等之前这样做时才有效。我认为这是像我这样的初学者的重要注意事项
。– ashrasmun

哇。@ashrasmun使我免于几个小时后发疯。在意识到这些命令的顺序非常相关之前,绝对没有任何工作。
节肢动物,

2
$ cat CMakeLists.txt
project (hello)
set(EXECUTABLE_OUTPUT_PATH "bin")
add_executable (hello hello.c)

1

英语不是我的母语。请原谅输入错误。

使用此行配置:
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build/)
放置任何CMakeLists.txt项目。
$ {PROJECT_SOURCE_DIR}是您当前项目所在的源目录。
如果漫步$$ {EXECUTABLE_OUTPUT_PATH}为何
检查此文件,CMakeCache.txt然后搜索关键字output path
所有变量都在此处定义,它将对项目进行全面说明 setting·


0
cat CMakeLists.txt
project (hello)
set(CMAKE_BINARY_DIR "/bin")
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR})
add_executable (hello hello.c)

8
您能在答案中添加一些解释吗?
Paul Floyd '18

0

不管我是在主CMakeLists.txt中定义还是在单个CMakeLists.txt中定义,它仍然假定我希望所有路径都远离主路径,这是所有路径中最没有用的假设。


0

要添加到此:

如果您使用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 )
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.