分享

CMake 实例学习(1)内外之分

 馆名不空 2014-03-09
1:基本语法规则
   无规矩不成方圆,每个工具都有自己的语言和语法,我们先看下最基本的语法规则:
  • 变量用${VAR}获取变量的值,凡事都有例外,在IF语句中可以直接使用变量名,这个有点那个。
  • 指令(参数1 参数2...)跟函数调用很像吧。参数之间可以用空格或者;隔开。
  • 指令大小写无关,但是参数却相关,这个也有点那个。我们指令还是都用大写的吧,好记。
2:何谓内外
  •    内部构建(in-source build)
  •    外部构建(out-of-source build)
   从字面上我们已经知道了,内部构建就是和源文件在一起构建,外部构建就是和源文件不在一个目录。上面我们已经看到了,构建后在我们的源文件目录下多了很多临时文件,因为cmake没有理想的办法执行命令来删除这些临时文件,这就有了我们的外部构建,我们以后还是使用外部构建吧。

3:重新构建(外部构建)
   前面一节我们看到的就是所谓内部构建,下面我们来看看常用的外部构建。
  1. 删除临时文件,只保留我们的源文件和CMakeLists.txt文件
  2. 在同一目录建立一个build目录,并进入
  3. 外部构建我们的工程

  1. [onezeroone@ ex-1]$ ls
  2. CMakeLists.txt hello.c
  3. [onezeroone@ ex-1]$ mkdir build
  4. [onezeroone@ ex-1]$ cd build/
  5. [onezeroone@ build]$ cmake ..
  6. -- The C compiler identification is GNU
  7. -- The CXX compiler identification is GNU
  8. -- Check for working C compiler: /usr/bin/gcc
  9. -- Check for working C compiler: /usr/bin/gcc -- works
  10. -- Detecting C compiler ABI info
  11. -- Detecting C compiler ABI info - done
  12. -- Check for working CXX compiler: /usr/bin/c++
  13. -- Check for working CXX compiler: /usr/bin/c++ -- works
  14. -- Detecting CXX compiler ABI info
  15. -- Detecting CXX compiler ABI info - done
  16. -- Configuring done
  17. -- Generating done
  18. -- Build files have been written to: /home/onezeroone/work/backup/cmake/ex-1/build
  19. [onezeroone@ build]$ ls
  20. CMakeCache.txt CMakeFiles cmake_install.cmake Makefile
  21. [onezeroone@ build]$ make
  22. Scanning dependencies of target hello
  23. [100%] Building C object CMakeFiles/hello.dir/hello.c.o
  24. Linking C executable hello
  25. [100%] Built target hello
  26. [onezeroone@ build]$ ./hello
  27. Hello world
  28. [onezeroone@ build]$
注意现在我们cmake的时候,跟的路径是CMakeLists.txt文件所在的路径“..”父目录,现在所有生成的文件都在build目录下面,这样我的源文件看起来还是很整齐的,不影响心情就好。

4:丰富下我们的CMakeLists.txt
  1. PROJECT(EX-1)
  2. SET(SRC_LIST hello.c)
  3. MESSAGE(STATUS "The BINARY dir is ${PROJECT_BINARY_DIR}")
  4. MESSAGE(STATUS "The SOURCE dir is ${PROJECT_SOURCE_DIR}")
  5. ADD_EXECUTABLE(hello ${SRC_LIST})
我们可以看到我们的project名字和生成的可执行文件名字是没有关系的。
SET指令的语法:
SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
用来定义变量的,前面提到我们可以用 ${VAR}来获取变量值。

MESSAGE指令的语法:
MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message" ...)
SEND_ERROR:表示产生错误信息,过程将被跳过。
STATUS:表示一般的状态信息。前面我们看到会自动加前缀“-”
FATAL_ERROR:我们知道肯定是严重错误信息,cmake会立即停止执行。

PROJECT会定义两个隐式的变量“PROJECT_BINARY_DIR”和“PROJECT_SOURCE_DIR”,前者就是我们构建时的目录,后者就是源文件所在的目录。其中的PROJECT也可以有PROJECT指令指定的工程名代替,例如“EX-1_BINARY_DIR”和“EX-1_SOURCE_DIR”我们推荐前者,这样不用每次都修改。

5:再构建下吧
  1. [onezeroone@ ex-1]$ ls
  2. build CMakeLists.txt hello.c
  3. [onezeroone@ ex-1]$ cd build/
  4. [onezeroone@ build]$ ls
  5. CMakeCache.txt CMakeFiles cmake_install.cmake hello Makefile
  6. [onezeroone@ build]$ rm -rf *
  7. [onezeroone@ build]$ ls
  8. [onezeroone@ build]$ cmake ..
  9. -- The C compiler identification is GNU
  10. -- The CXX compiler identification is GNU
  11. -- Check for working C compiler: /usr/bin/gcc
  12. -- Check for working C compiler: /usr/bin/gcc -- works
  13. -- Detecting C compiler ABI info
  14. -- Detecting C compiler ABI info - done
  15. -- Check for working CXX compiler: /usr/bin/c++
  16. -- Check for working CXX compiler: /usr/bin/c++ -- works
  17. -- Detecting CXX compiler ABI info
  18. -- Detecting CXX compiler ABI info - done
  19. -- The BINARY dir is /home/onezeroone/work/backup/cmake/ex-1/build
  20. -- The SOURCE dir is /home/onezeroone/work/backup/cmake/ex-1
  21. -- Configuring done
  22. -- Generating done
  23. -- Build files have been written to: /home/onezeroone/work/backup/cmake/ex-1/build
  24. [onezeroone@ build]$ ls
  25. CMakeCache.txt CMakeFiles cmake_install.cmake Makefile
  26. [onezeroone@ build]$ make
  27. Scanning dependencies of target hello
  28. [100%] Building C object CMakeFiles/hello.dir/hello.c.o
  29. Linking C executable hello
  30. [100%] Built target hello
  31. [onezeroone@ build]$ ls
  32. CMakeCache.txt CMakeFiles cmake_install.cmake hello Makefile
  33. [onezeroone@ build]$ ./hello
  34. Hello world
  35. [onezeroone@ build]$
我们可以看到期望的BINARY_DIR和SOURCE_DIR了。这就是我们的外部构建了。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多