如何在CMAKE中使用缓存变量和CMakeList.txt文件时禁止不需要的输出构建文件

时间:2016-04-30 21:21:30

标签: c++ makefile cmake

目前,我在主文件夹中有一个CMakeLists.txt文件,其中包含以下代码:

cmake_minimum_required(VERSION 3.5)

SET(CMAKE_GENERATOR "MinGW Makefiles" CACHE INTERNAL "" FORCE)
SET(CMAKE_TOOLCHAIN_FILE ${PROJECT_SOURCE_DIR}/ToolChain.cmake)

project(Blinky)

SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin)

...

当我运行它时,它首先将Visual Studio输出到源目录。当我第二次运行它时,它会输出相应的minGW makefile但仍然是源目录而不是bin文件夹。有没有办法将它配置为直接构建MinGW Makefile和正确的输出文件夹?

我在命令行提示符下运行脚本,并使用源目录文件夹中的以下代码行:

cmake CMakeLists.txt

2 个答案:

答案 0 :(得分:0)

您不应该从源目录运行cmake。这绝对是一种不好的做法

实际上,这会将您的makefile(或您的Visual Studio文件)与您的源文件混合在一起,甚至可能损坏您的源目录(取决于您在CMakeLists.txt中指定的内容)。

你需要做什么

首先,您需要创建一个单独的构建目录,您将在其中启动cmake。

然后,如果要使用MinGW makefile生成,请在build目录中启动以下命令行:

cmake path_to_source_directory -G "MinGW Makefiles"

关于您的CMakeList.txt的进一步评论

由于上面的命令行指定了生成器(选项-G“...”),SET(CMAKE_GENERATOR "MinGW Makefiles" CACHE INTERNAL "" FORCE)是无用的。看看this SO post and its answers。它解释了为什么在第二次启动时首次启动CMake和MinGW makefile时生成Visual Studio文件。

然后,正如@Craig Scott所说,你应该用SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin)替换SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)。否则,您的可执行文件将放在源目录中。

答案 1 :(得分:0)

从您要用作构建目录的目录运行cmake,而不是从源树中运行。这将为您提供源代码构建(有关此内容的详细信息,请参阅here。)

您必须在命令行中设置要使用的CMake生成器和工具链文件,而不是在CMakeLists.txt文件中执行此操作。此外,您不在cmake命令行中包含CMakeLists.txt文件的名称,而是包含它所在的目录。例如:

cmake -G "MinGW Makefiles" -DCMAKE_TOOLCHAIN_FILE=/path/to/source/dir/ToolChain.cmake /path/to/source/dir

最后,为了指定可执行文件的位置,请确保使用correct CMake variables并确保将它们放在构建目录中的某个位置,而不是源树:

SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)