ChatGPT解决这个技术问题 Extra ChatGPT

如何使 CMake 输出到“bin”目录?

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


P
Peter Mortensen

正如 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/…
如何使其一次应用于所有配置?
考虑到命令 install(TARGETS <target_name>) 仍然抱怨“没有为可执行目标指定 RUNTIME DESTINATION”,设置 CMAKE_ARCHIVE_OUTPUT_DIRECTORY 的目的是什么?这个变量应该提供一个默认值,因此 install 命令不应抱怨缺少 RUNTIME DESTINATION
CMAKE_ARCHIVE_OUTPUT_DIRECTORY 设置静态(归档)库(Linux 上的 .a 文件)的构建位置。它不会影响 install 放置文件的位置。
G
Guy Avraham

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


使用目录的完整路径名作为变量值,并且不要在值中添加尾随“/”......就像亚当鲍文的回答一样。
为什么需要添加完整路径?当你移动你的项目时,这似乎很烦人......
可能将路径“/some/full/path/to/bin”更改为相对于根 CMakeLists.txt 的路径,该路径将在 ${CMAKE_SOURCE_DIR} 中设置
P
Peter Mortensen

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

CMake 2.8.8 Documentation


EXECUTABLE_OUTPUT_PATH 现在仍然有效,但它是实现此结果的“旧”方式。 Adam Bowen 的回答是推荐的方法。
m
mcandre
$ cat CMakeLists.txt
project (hello)
set(EXECUTABLE_OUTPUT_PATH "bin")
add_executable (hello hello.c)

J
Jayhello

至于我,我使用的是 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/"
)

我将亚当的答案与 set (CMAKE_...
哇。几个小时后,@ashrasmun 让我免于发疯。在意识到这些命令的顺序非常相关之前,绝对没有任何效果。
CMake 版本 3.19,这有效:set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "/some/full/path/to/bin")。您还可以指定相对于当前目录(正在执行 cmake 命令的目录)的相对路径。
u
user438383

使用此行配置:

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build/)
放置您的任何 CMakeLists.txt 项目。

这个 ${PROJECT_SOURCE_DIR} 是您当前项目所在的源目录。
如果徘徊为什么 ${EXECUTABLE_OUTPUT_PATH} 检查这个文件 CMakeCache.txt 然后搜索关键字 output path,所有变量都在这里定义,它会给出一个完整的项目所有设置的解释。


s
serg06

要补充这一点:

如果您使用 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 )

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

您能否为您的答案添加一些解释?
J
Jerry Miller

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


B
BTJ

serg06's answer 的另一项改进:

要强制三个路径按原样用于所有生成器和所有构建配置,您可以添加一个空的生成器表达式,如下所示:

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "$<0:>${CMAKE_BINARY_DIR}/bin") # .exe and .dll
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "$<0:>${CMAKE_BINARY_DIR}/lib") # .so and .dylib
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "$<0:>${CMAKE_BINARY_DIR}/lib") # .lib and .a

这具有强制 Visual Studio 生成器特别按原样使用指定路径的副作用,而不是附加特定于配置的子目录,而无需 foreach 循环。