据我了解,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, ...)
。
答案 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}