我不是只问自己这个问题.我希望这个问题可以作为许多喜欢我的新手的参考,发现它对于这样一个小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 次 |
| 最近记录: |