zoukankan      html  css  js  c++  java
  • make CMake 来龙去脉

    理论上说,任意一个C++程序都可以用g++来编译。

    大家都知道,写程序大体步骤如下:

    1、用编辑器编写源代码,如.c文件。

    2、用编译器编译代码生成目标文件,如.o。

    3、用链接器连接目标代码生成可执行文件,如.exe。

    makefile

    但如果源文件太多,一个一个编译时就会特别麻烦,于是人们想到,为什么不设计一种类似批处理的程序,来批处理编译源文件呢?

    于是就有了make工具,它是一个自动化编译工具,你可以使用一条命令实现完全编译。

    但是你需要编写一个规则文件,make依据它来批处理编译,这个文件就是makefile,所以编写makefile文件也是一个程序员所必备的技能。

    Unix中Make三连

    Unix 开发过程中,经常性的操作是从源码编译安装相应库文件,所以下面三个命令便是家常便饭,俗称三连:

    ./configure

    make

    make install

    下面来看看这三步分别做了什么。

    configure

    执行 ./configure 文件一般是进行正式编译前的一些环境准备,准备编译需要的依赖项等。比如检测当前的系统平台,检测需要的编译器是否存在如何调用,配置和生成相应编译所需文件。

    make

    前期准备工作完成无误后,就可能调用 make 来执行编译了。实际执行的是 Makefile 文件中定义的任务来从源码进行项目的编译。

    通常情况下下载下来的 tar 包中可能没有包含正式的 Makefile 文件,而是另外形式呈现的临时文件,比如 Makefile.in,Makefile.am,Makefile.MSVC 等,然后在执行 ./configure 的时候根据相应环境来生成最终需要的 Makefile 文件。

    make install

    项目编译正常后,会生成相应的产出,可执行文件,so 或 o 文件或 DLL 动态链接文件等。最后一步就是将生成的文件复制到相应的系统目录,这个过程便是安装。

    比如将可执行文件复制到系统 PATH 能取到的地方,帮助文档复制到 MANPATH,其他文件复制到对应目录下。

    CMakelists.txt

    对于一个大工程,编写makefile实在是件复杂的事,于是人们又想,为什么不设计一个工具,读入所有源文件之后,自动生成makefile呢?

    于是就出现了cmake工具,它能够输出各种各样的makefile或者project文件,从而帮助程序员减轻负担。

    但是随之而来也就是编写cmakelist文件,它是cmake所依据的规则。所以在编程的世界里没有捷径可走,还是要脚踏实地的。

     CMakeLists.txt基本结构 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    #声明要求的cmake最低版本
    cmake_minimun_required(VERSION 2.8)
    #声明一个cmake工程,工程名为post_fusion
    project(post_fusion)
    # 添加c++ 11标准支持
    set( CMAKE_CXX_FLAGS "-std=c++11" )
    如果程序中使用了C++11标准,则需要设置告诉编译器,没有可以不用写。
    #设置编译器编译模式:
    set( CMAKE_BUILD_TYPE "Debug" )
    对于编译用的Debug模式和调试用的Release模式,在Debug模式中,程序运行较慢,当可以在IDE中进行断点调试,而Release模式则速度较快,但没有调试信息。不设置默认是Debug模式。
    # 添加引用的第三方头文件,例如添加Eigen头文件
    include_directories( "/usr/include/eigen3" )
    #编译生成库文件
    add_library(irfusion comfunc.c post_sins_gnss.cpp)
    #这条命令告诉cmake,我们想把这些源文件编译成一个叫作“irfusion”的库。在linux中,库文件分为静态库和动态库两种,静态库以.a作为后缀名,共享库以.so结尾。
    #所有库都是一些函数打包后的集合,差别在于静态库每次被调用都会生成一个副本,而共享库则只有一个副本,更省空间。如果想生成共享库而不是静态库,只需要使用以下语句即可
    add_library(irfusion_shared SHARED  comfunc.c post_sins_gnss.cpp)此时得到的文件就是irfusion_shared.so了。
    #然后,在CMakeList.txt中添加一个可执行程序的生成命令,链接到刚才使用的库上:
    add_executable(irfusion main.cpp)
    target_link_libraries(irfusion irfusion_shared)
  • 相关阅读:
    AtCoder Regular Contest 093
    AtCoder Regular Contest 094
    G. Gangsters in Central City
    HGOI 20190711 题解
    HGOI20190710 题解
    HGOI 20190709 题解
    HGOI 20190708 题解
    HGOI20190707 题解
    HGOI20190706 题解
    HGOI 20190705 题解
  • 原文地址:https://www.cnblogs.com/MakeView660/p/11363334.html
Copyright © 2011-2022 走看看