与GNU autotools的功能相似,CMake是一个自动化的工具套件,用于build,test和package软件。它使用相对简单的,不依赖于平台和编译器的配置文件,来控制软件的编译过程,并生成原生的Makefile文件和工作台用于你所选择的编译器。

要在你的项目中使用CMake,你唯一需要的是CMakeLists.txt文件。在首次运行cmake的时候将在build tree的顶部目录产生一个CMakeCache.txt文件。该文件存储一系列全局cache变量,也就是配置,可以在下次运行cmake的时候使用。例如:Option命令产生一个boolean的变量并存储在cache里。

option(USE_JPEG "Do you want to use the jpeg library")

上面的命令产生了一个变量USE_JPEG,并放在cache里。用户可以通过接口(GUI或命令行)设置它的值,这个值也存储在cache里,这样下次运行cmake的时候可以直接调用,而不用再在命令行中输入。

除了用户选择的配置,cache还存储一些系统相关的环境变量。这些变量通常需要运行cmake命令编译项目时才能计算出来。那么这样在下次运行cmake的时候,就直接使用这些值,节省编译运行的时间。

CMakeCache.txt可以提升cmake编译项目的效率,但是如果其所在的项目运行环境发生了很大的变化,比方说从32bit机器到了64bit的机器,或者操作系统发生重大变化。再次运行cmake的时候,使用CMakeCache.txt的值可能会报错。如在编译我的项目的时候,有如下输出:

cd /home/minipc/cucc-ct/apps/public/libubox-2015-06-14 && cmake -D CMAKE_INSTALL_PREFIX:PATH=/home/minipc/cucc-ct/apps/public/libubox-2015-06-14/install ./

  -- The C compiler identification is GNU 4.6.3

  -- Check for working C compiler: /opt/trendchip/mipsel-linux-glibc2.22-4.6.3/usr/bin/mipsel-buildroot-linux-gnu-gcc

  CMake Error: Generator: execution of make failed. Make command was: /usr/bin/gmake cmTC_003e6/fast &&

 -- Check for working C compiler: /opt/trendchip/mipsel-linux-glibc2.22-4.6.3/usr/bin/mipsel-buildroot-linux-gnu-gcc -- broken

 CMake Error at /usr/share/cmake-3.16/Modules/CMakeTestCCompiler.cmake:60 (message):

   The C compiler

     "/opt/trendchip/mipsel-linux-glibc2.22-4.6.3/usr/bin/mipsel-buildroot-linux-gnu-gcc"

   is not able to compile a simple test program.

   It fails with the following output:

 Change Dir: /home/minipc/cucc-ct/apps/public/libubox-2015-06-14/CMakeFiles/CMakeTmp

   Run Build Command(s):/usr/bin/gmake cmTC_003e6/fast && No such file or directory

   Generator: execution of make failed. Make command was: /usr/bin/gmake cmTC_003e6/fast &&

错误的根源是 Make command : /usr/bin/gmake cmTC_003e6/fast &&。用grep查了一下,这条语句存储在CMakeCache.txt中。如:

CMakeCache.txt:CMAKE_MAKE_PROGRAM:FILEPATH=/usr/bin/gmake

是原SDK在以前的平台运行的时候留下的。而在新平台里/usr/bin/gmake和cmTC_003e6/fast 文件都没有。

解决方案:有的开发者会想到去手动更改CMakeCache.txt中的值,这是不建议的,因为未必会生效,也可能引入语法错误。

解决方案其实很简单,就是$rm所有CMakeCache。在项目重新编译的过程中,会调用cmake重新计算与运行环境相关的值。当然,用户选项如果仅在CMakeCache.txt中,而没有在项目中的其它文件中记录,需要手动添加。

参考文献:CMake Cache

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐