为什么二进制文件不在CMAKE_CURRENT_BINARY_DIR中?

时间:2017-09-22 18:33:30

标签: c++ cmake

据我了解,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}")

的main.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, ...)

2 个答案:

答案 0 :(得分:4)

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

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

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

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

要确定具有可执行文件的目录,请使用$<TARGET_FILE_DIR:tgt> generator expression(而不是tgt创建目标的名称,应使用可执行文件。)

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

答案 1 :(得分:0)

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