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)
  • 相关阅读:
    转 Wireshark和TcpDump抓包分析心得
    ubuntu tomcat的安装与配置
    好久之前就看到的,这次必须转了
    【1】记一次破解wifi
    aircrack加reaver破解带有wps的wifi
    hydra 密码破解工具详解
    树莓派上手常见问题处理[转]
    破解邻居家的wifi密码
    完全教程 Aircrack-ng破解WEP、WPA-PSK加密利器
    Ubuntu中启用关闭Network-manager网络设置问题! 【Server版本】
  • 原文地址:https://www.cnblogs.com/MakeView660/p/11363334.html
Copyright © 2011-2022 走看看