我不是只问自己这个问题.我希望这个问题可以作为许多喜欢我的新手的参考,发现它对于这样一个小CMakeLists.txt
文件 后幕后到底发生了什么感到非常困惑.
cmake_minimum_required (VERSION 2.6)
project(Tutorial)
add_executable(Tutorial tutorial.cpp)
Run Code Online (Sandbox Code Playgroud)
这么小 tutorial.cpp
int main() { return 0; }
Run Code Online (Sandbox Code Playgroud)
生成的文件太多了
CMakeCache.txt cmake_install.cmake Makefile
CMakeLists.txt tutorial.cpp
Run Code Online (Sandbox Code Playgroud)
和一个CMakeFiles
包含这么多文件和文件夹的文件夹
CMakeCCompiler.cmake CMakeOutput.log Makefile.cmake
cmake.check_cache CMakeSystem.cmake progress.marks
CMakeCXXCompiler.cmake CMakeTmp TargetDirectories.txt
CMakeDetermineCompilerABI_C.bin CompilerIdC Tutorial.dir
CMakeDetermineCompilerABI_CXX.bin CompilerIdCXX
CMakeDirectoryInformation.cmake Makefile2
Run Code Online (Sandbox Code Playgroud)
不了解幕后发生的事情(即:为什么文件必须生成以及它们的目的是什么),是能够学习CMake的最大障碍.
如果有人知道,你可以为了后代而解释它吗?这些文件的目的是什么,当我输入时cmake .
,在构建项目之前cmake配置和生成究竟是什么?
Com*_*sMS 81
秘诀是您不必了解生成的文件的作用.
CMake在构建系统中引入了很多复杂性,如果你用它来构建复杂的软件项目,它们中的大部分都会得到回报.
好消息是,CMake很好地保持了很多这种混乱:使用源外构建,你甚至不必查看生成的文件.如果你到目前为止没有这样做(我猜你自己就是这样cmake .
),请在继续之前检查它们.混合构建和源目录对于CMake来说真的很痛苦,而不是系统应该如何使用.
简而言之:而不是
cd <source_dir>
cmake .
Run Code Online (Sandbox Code Playgroud)
总是用
cd <build_dir_different_from_source_dir>
cmake <source_dir>
Run Code Online (Sandbox Code Playgroud)
代替.我通常build
在源目录中使用一个空的子文件夹作为构建目录.
为了减轻您的痛苦,让我快速概述一下CMake生成的相关文件:
ccmake
或cmake-gui
.这对于不时查看可能很有用,但我建议使用上述工具来更改任何值(如果可能).CMakeFiles
子目录中发生的任何事情.一般来说,你不应该搞乱CMake为你生成的任何文件.所有问题都可以通过CMakeLists.txt
一种方式或另一种方式从内部解决.只要结果按预期构建您的项目,您可能就好了.不要过分担心血腥的细节 - 因为这是CMake首先试图饶恕你的东西.
Pat*_*ryk 13
如其网站上所述:
Cmake是一个跨平台的开源构建系统,用于使用独立于编译器的方法管理软件的构建过程
在大多数情况下,它用于生成项目/生成文件 - 在您的示例中,它已生成Makefile
用于构建软件的文件(主要在Linux/Unix平台上).
Cmake允许提供跨平台构建文件,这些文件将为特定编译/平台生成特定于平台的项目/ make文件.
例如,您可以尝试使用Visual Studio在Windows上编译软件,然后在您CMakeLists.txt
可以启动的文件中使用适当的语法
cmake .
Run Code Online (Sandbox Code Playgroud)
在Windows平台上的项目目录中,Cmake将生成所有必要的项目/解决方案文件(.sln
等).
如果您想在Linux/Unix平台上构建您的软件,您只需转到您拥有CMakeLists.txt
文件的源目录并触发cmake .
它,它将生成您通过简单make
或者构建软件所需的所有文件 make all
.
这里有一些关于关键Cmake功能的非常好的演示http://www.elpauer.org/stuff/learning_cmake.pdf
编辑
如果您想制作与平台相关的库包含/变量定义等,则可以在CMakeLists.txt
文件中使用此语法
IF(WIN32)
...do something...
ELSE(WIN32)
...do something else...
ENDIF(WIN32)
Run Code Online (Sandbox Code Playgroud)
还有很多命令可以防止构建失败,Cmake会通知您,例如您没有升级库filesystem
并regex
安装在您的系统上.为此,您可以使用以下语法:
find_package(Boost 1.45.0 COMPONENTS filesystem regex)
Run Code Online (Sandbox Code Playgroud)
检查它是否会为适当的系统/ IDE /编译器生成makefile.
归档时间: |
|
查看次数: |
52529 次 |
最近记录: |