CMake: 构建目标目录错误

4

系统:

Linux anon-S 3.19.0-31-generic #36~14.04.1-Ubuntu SMP Thu Oct 8 10:21:08 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

CMake版本:

anon@anon-S:~/$ cmake --version
cmake version 3.2.2

主要的CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.0)

set(CMAKE_CXX_STANDARD 11)

add_subdirectory(${PROJECT_SOURCE_DIR}/src)
add_subdirectory(${PROJECT_SOURCE_DIR}/test)

但是

anon@anon-S:/home/anon/project/build$ cmake ..
-- Configuring done
-- Generating done
-- Build files have been written to: /home/anon/project/

构建文件已经写入到:/home/anon/project/ 而不是 /home/anon/project/build/

我在我的Debian jessie上使用cmake 3.4.1没有这个问题:

anon@anon-S:/home/anon/project/build$ cmake ..
-- The C compiler identification is GNU 5.2.1
-- The CXX compiler identification is GNU 5.2.1
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found Doxygen: /usr/bin/doxygen (found version "1.8.11") 
-- Configuring done
-- Generating done
-- Build files have been written to: /home/anon/project/build/

1
srctest 子目录中的 CMakeLists.txt 文件包含什么内容? - Tsyvarev
2
你是否曾经在/home/anon/project目录下(导致源码和构建结果混杂)意外运行过CMake? - Angew is no longer proud of SO
@AngewisnolongerproudofSO 这是我不小心发生的。然而,我清除了所有的 git 状态,但我认为一些残留物导致这个问题仍然存在,直到重置所有内容,包括删除所有被忽略的文件。 - Martin Braun
1个回答

10

为了澄清这里发生的事情:

运行 cmake <directory> 会执行以下两种操作之一:

  • 如果 <directory> 是源代码目录(即其中包含一个 CMakeLists.txt 文件),则它将在该源代码上运行 CMake,并使用当前工作目录作为构建目录。
  • 如果<directory> 是构建目录(即其中包含一个 CMakeCache.txt 文件),则它将在用于创建该构建目录的源代码目录上运行 CMake。

请注意,后一种情况优先于第一种情况。也就是说,如果您执行以下操作:

cd <src_dir>
cmake .
 *oops, wrong directory, i didn't mean that*
cd build
cmake ..

您可能期望这将使用<src_dir>作为源目录,build作为构建目录来运行CMake。但由于第一次意外的CMake运行,<src_dir>现在也是一个内部构建的构建目录!因此,第二次运行将忽略build中的所有内容,并使用src_dir作为源目录和构建目录。
这确实是一个非常讨厌的问题,但幸运的是,一旦你意识到发生了什么,就可以非常快速地解决它:只需从<src_dir>中删除CMakeCache.txt文件即可。
请注意,在较新的CMake版本(3.13及更高版本)中,您可以使用命令行选项-S-B来消除目录参数的歧义:

-S <path-to-source>

CMake项目的根目录路径。

-B <path-to-build>

CMake将用作构建目录的根目录路径。

如果该目录不存在,则CMake会创建该目录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接