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

  • 相关阅读:
    tile38 复制配置
    The Guardian’s Migration from MongoDB to PostgreSQL on Amazon RDS
    tile38 一款开源的geo 数据库
    sqler sql 转rest api 的docker 镜像构建(续)使用源码编译
    sqler sql 转rest api javascript 试用
    sqler sql 转rest api redis 接口使用
    sqler sql 转rest api 的docker image
    sqler sql 转rest api 的工具试用
    apache geode 试用
    benthos v1 的一些新功能
  • 原文地址:https://www.cnblogs.com/Robin008/p/12122254.html
Copyright © 2011-2022 走看看