zoukankan      html  css  js  c++  java
  • make和cmake构建工具

      c++程序员一般都会使用make工具,在大型项目中还会使用cmake。这篇文章对于make编译的过程探讨的比较详细,可以参考:https://blog.csdn.net/qq_29094161/article/details/86760056。刚好现在就要使用make和cmake工具安装opencv,于是开始尝试:https://www.cnblogs.com/you-siki/p/OpenCV4-MacOS.html

      make -v, cmake -version可以看到,make和cmake是两个不同的工具(命令),make是GNU开发维护的免费软件,cmake是Kitware公司开发维护的免费软件,它们都是开源免费的(大赞,像这种免费工具软件,对于促进生产力发展大大有利,为我等屌丝开启了新世界)。Kitware就是那个开发VTK库的公司,广泛用于计算机图形学领域,比如CAD,CAE等领域。

      回顾我们开发c/c++程序的过程,一般从源码.cpp到可执行的机器码,需要源码文件,一般也会引用别人的库文件,make就是处理文件间的依赖关系的shell命令,其依赖和构建规则使用Makefile说明,这里推荐阮一峰老师的make教程。下面老说说makefile文件的编写:

    <target> : <prerequisites> 
    [tab]  <commands>

     这就是makefile的构成单元,非常简单明了,其中,commands就可以使用g++命令了。这样我们可以直接执行makefile文件,而不是逐个编译,链接,大大提高了工作效率。make install其实是一个约定的target,用于向计算机中写入库文件。make -D CMAKE_INSTALL_PREFIX=/usr/local,用于指定安装路径,cmake默认会安装在,usr/local中。

      可以看到,如果程序规模很大,编写Makefile也工作量也会很大,并且其修改也会很麻烦,于是cmake工具来啦,简单一句话就是生成Makefile的工具,其核心是CMakeLists.txt,这是一个典型的CMakeLists.txt的写法,它其中体现了很多特殊的命令,比如cmake_minimum_required要求对于cmake版本的支持,project命令说明了其工程的名字。if,else,set等命令的支持等。

    #一般都以这一行开始
    cmake_minimum_required (VERSION 2.6)
     
    #项目名
    project (TEST)
     
    #选择编译器,LINUX上选择g++,MAC OS上选择clang++
    if (APPLE)
    	set (CMAKE_CXX_COMPILER clang++)
    elseif (UNIX)
    	set (CMAKE_CXX_COMPILER g++)
    endif()
    
    #设置编译器选项支持c++11
    set (CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -std=c++11)
     
    #查找boost库
    find_library (BOOST_SYSTEM
    	NAMES boost_system
    	PATHS /usr/lib /usr/local/lib
    	)
     
    find_library (BOOST_THREAD
    	NAMES boost_thread
    	PATHS /usr/lib /usr/local/lib
    	)
     
     
    #设置数学库的目标名,该变量在子目录也是可见的
    set (MATH_LIB "my_math")
     
    #添加头文件搜索路径
    include_directories (./math)
     
    #添加子目录,这样math目录才会被编译
    add_subdirectory (math)
     
    #添加可执行目标文件Test
    add_executable (Test main.cpp)
     
    #LIBS变量存储所有需要链接的库
    set (LIBS ${MATH_LIB})
     
    if (BOOST_SYSTEM) 
    	set (LIBS ${LIBS} ${BOOST_SYSTEM})
    endif()
     
    if (BOOST_THREAD)
    	set (LIBS ${LIBS} ${BOOST_THREAD})
    endif()
     
    #为可执行文件链接数学库
    
    ————————————————
    版权声明:本文为CSDN博主「jupiterwangq」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/ztemt_sw2/article/details/81355096

    参考资料:阮一峰make教程:http://www.ruanyifeng.com/blog/2015/02/make.html

        cmake官方说明文档:https://cmake.org/cmake/help/latest/guide/tutorial/index.html

  • 相关阅读:
    USB描述符(转)
    (转)Linux设备驱动之HID驱动 源码分析
    Linux USB 鼠标驱动程序详解(转)
    (转)linux如何获取鼠标相对位置信息
    从零写一个编译器(四):语法分析之构造有限状态自动机
    从零写一个编译器(三):语法分析之几个基础数据结构
    从零写一个编译器(二):语法分析之前置知识
    从零写一个编译器(一):输入系统和词法分析
    自底向上语法分析
    递归下降和LL(1)语法分析
  • 原文地址:https://www.cnblogs.com/Robin008/p/12122254.html
Copyright © 2011-2022 走看看