【问题标题】:Why aren't binaries placed in CMAKE_CURRENT_BINARY_DIR?为什么二进制文件没有放在 CMAKE_CURRENT_BINARY_DIR 中?
【发布时间】:2017-09-22 18:33:30
【问题描述】:

据我了解,CMAKE_CURRENT_BINARY_DIR 应指向当前 CMakeLists.txt 文件的二进制文件所在的目录。然而,情况似乎并非如此。

考虑这个文件结构:

CMakeTest
+- CMakeLists.txt
+- main.cpp

CMakeLists.txt

cmake_minimum_required(VERSION 3.2)
add_executable(CMakeTest main.cpp)
message(STATUS "CMAKE_CURRENT_BINARY_DIR = ${CMAKE_CURRENT_BINARY_DIR}")

ma​​in.cpp

#include <iostream>

int main() {
    std::cout << "Hello, World!";
    return 0;
}

在 (Windows) 命令行上,我运行以下命令:

md build
cd build
cmake .. -G "Visual Studio 14 2015"
cmake --build .

第一个cmake 命令打印(除其他外)该行

CMAKE_CURRENT_BINARY_DIR = X:/dev/projects/CMakeTest/build

所以我希望生成的二进制文件 CMakeTest.exe 会在那里结束。但实际上,它位于 X:/dev/projects/CMakeTest/build/Debug 中。

为什么二进制文件没有放在CMAKE_CURRENT_BINARY_DIR,而是放在一个子目录中?是否有任何 CMake 变量可以告诉我该子目录是什么?

编辑:

我不想更改二进制文件所在的目录。我正在尝试确定它。原因是这样的:

在构建期间,会在与可执行文件相同的目录中创建许多附加资源文件。 (这部分有效。)我想使用install(FILES, ...) 命令将这些文件添加到生成的包中。所以我需要将放置二进制文件的实际路径传递给install(FILES, ...)

【问题讨论】:

  • 我猜,这是MSVC生成器的一个缺点。
  • 我相信这是一件好事。我的意思是调试和发布可执行文件不兼容,并且可能命名相同,最好将它们保存在单独的文件夹中。请记住,在 MSVC 中,默认情况下您有 4 种配置。
  • @arrowd:这似乎不是生成器问题。在 OS X 上使用Xcode 生成器具有相同的结果。
  • 并使用Unix Makefiles?
  • @drescherjm:我并不是说子目录是一件坏事。我只是在问如何找出二进制文件的实际去向。

标签: c++ cmake


【解决方案1】:

变量CMAKE_CURRENT_BINARY_DIR 表示“CMake 当前正在处理 的二进制目录”。通常,此目录及其子目录包含构建工件,如可执行文件、库或其他生成的文件。

如果你想控制正在构建的可执行文件的位置,你需要设置变量CMAKE_RUNTIME_OUTPUT_DIRECTORY

请注意,multiconfiguration 构建工具(如 Visual Studio)将为每个特定配置在 CMAKE_RUNTIME_OUTPUT_DIRECTORY 下创建子目录(命名为配置本身)。否则,为不同配置创建的可执行文件会覆盖自身。

精确控制用于构建可执行文件的每个配置目录,请使用变量CMAKE_RUNTIME_OUTPUT_DIRECTORY_<CONFIG>。 (而不是 应插入特定配置的名称,因此 CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG 变量将影响 Debug 构建)。


如果只确定带有可执行文件的目录,请使用$&lt;TARGET_FILE_DIR:tgt&gt; generator expression(而不是tgt,应使用创建可执行文件的目标名称)。

请注意,生成器表达式只能在特定位置使用。例如,install(FILES) 命令的文件列表可以使用生成器表达式,但message() 命令不能。

【讨论】:

  • 感谢您的解释,@Tsyvarev。恐怕我不太清楚我要达到的目标。我在我的问题中添加了一个“编辑:”段落。如果你能看看就太好了!
  • 看起来您正在搜索 $&lt;TARGET_FILE_DIR:tgt&gt; 生成器表达式,请参阅编辑后的答案。
【解决方案2】:

是的,可执行文件通常存储在低于 CMAKE_CURRENT_BINARY_DIR 的级别,具体取决于构建类型。您可以使用 ${CMAKE_BUILD_TYPE} (通常具有 Debug 或 Release 的值)直接导航到此目录,方法是构建完整路径,例如: ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-17
    • 2020-12-06
    • 2020-09-25
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 2010-09-29
    • 2020-10-05
    相关资源
    最近更新 更多