ROS交流群
ROS Group
产品服务
Product Service
开源代码库
Github
官网
Official website
技术交流
Technological exchanges
激光雷达
LIDAR
ROS教程
ROS Tourials
深度学习
Deep Learning
机器视觉
Computer Vision

Linux常见编译系统总结



  • 在Linux系统中经常会遇到各种编译程序的方法。很多情况下我们只知道这样做而不知道为什么这样做。这篇文章就通过一个简单的hello world程序来通过不同的编译方式进行编译。让大家了解一下比较常见的各种编译系统。编译过程最重要的地方就是指定头文件和链接库的位置。主要问题在于软件的模块化和依赖关系。所以不同的编译系统采用了不同的方式进行管理。

    cmake

    cmake是一个很常用的编译系统。通过它可以方便的配置程序的各种编译参数。具体的介绍可以看这篇文章
    下面是一个具体的例子
    创建一个CMakeLists.txt文件,文件内容如下

    cmake_minimum_required(VERSION 2.8.3)
    
    project(helloworld)
    
    add_executable(helloworld
      main.c
    )
    

    创建一个叫做main.c的文件,文件内容如下

    #include <stdio.h>
    
    int main(void){
        printf("hello world!\n");
    }
    

    编译过程

    mkdir build
    cd build
    cmake ..
    make
    

    文件夹内容如下
    0_1492224768568_Screenshot from 2017-04-15 10-52-17.png
    执行结果
    0_1492224801960_Screenshot from 2017-04-15 10-53-14.png
    程序说明
    这个一个简单的CMakeLists.txt文件,没有涉及到软件依赖的问题。CMake的强大之处就是其软件包管理能力。具体的使用方法可以看这篇文章

    autotools

    在Linux中使用源码编译程序中经常会有这个过程

    ./configure
    make
    make install
    

    这种方式使用的就是autotools
    还是以一个hello world为例。创建一个configure.ac文件,文件内容入下

    AC_INIT([helloworld], [0.1], [george@thoughtbot.com]) # 指定项目名称, 版本号, 项目管理人员
    AM_INIT_AUTOMAKE # 初始化
    AC_PROG_CC  # 检查C的环境依赖
    AC_CONFIG_FILES([Makefile]) # 指定Make File
    AC_OUTPUT # 生成脚本
    

    创建一个Makefile.am,文件内容如下

    AUTOMAKE_OPTIONS = foreign  # 说明这是一个foreign的程序
    bin_PROGRAMS = helloworld  # 生成文件的名称
    helloworld_SOURCES = main.c # 指定源文件
    

    然后执行下面的指令进行编译

    aclocal # Set up an m4 environment
    autoconf # Generate configure from configure.ac
    automake --add-missing # Generate Makefile.in from Makefile.am
    ./configure # Generate Makefile from Makefile.in
    make distcheck # Use Makefile to build and test a tarball to distribute
    

    这时候可以看到一个helloworld-0.1.tar.gz的文件。这个就是最终生成的发行版本。解压后就可以按照正常的编译过程进行编译。

    程序说明
    configure.ac文件是autoconf工具的配置文件,用于生成最后的configure文件 . Makefile.am用于生成makefile。具体的使用方法可以看这篇文章

    pkg-config

    pkg-config不是一个完整的编译系统,只是一个编译工具,可以方便的给程序指cflags。下面是一个例子
    假设系统中安装了OpenCV

    pkg-config opencv-3.2.0-dev --cflags
    终端输出
    -I/opt/ros/kinetic/include/opencv-3.2.0-dev/opencv -I/opt/ros/kinetic/include/opencv-3.2.0-dev
    
    pkg-config opencv-3.2.0-dev --libs
    终端输出
    -L/opt/ros/kinetic/lib -lopencv_stitching3 -lopencv_superres3 -lopencv_videostab3 -lopencv_aruco3 -lopencv_bgsegm3 -lopencv_bioinspired3 -lopencv_ccalib3 -lopencv_cvv3 -lopencv_datasets3 -lopencv_dpm3 -lopencv_face3 -lopencv_fuzzy3 -lopencv_hdf3 -lopencv_line_descriptor3 -lopencv_optflow3 -lopencv_plot3 -lopencv_reg3 -lopencv_saliency3 -lopencv_stereo3 -lopencv_structured_light3 -lopencv_phase_unwrapping3 -lopencv_rgbd3 -lopencv_viz3 -lopencv_surface_matching3 -lopencv_text3 -lopencv_xfeatures2d3 -lopencv_shape3 -lopencv_video3 -lopencv_ximgproc3 -lopencv_calib3d3 -lopencv_features2d3 -lopencv_flann3 -lopencv_xobjdetect3 -lopencv_objdetect3 -lopencv_ml3 -lopencv_xphoto3 -lopencv_highgui3 -lopencv_videoio3 -lopencv_imgcodecs3 -lopencv_photo3 -lopencv_imgproc3 -lopencv_core3
    

    编译的时候就不用手动指定库了。pkg-config的配置文件在/usr/lib/pkgconfig, 可以在这里看到每个软件包的信息。


Log in to reply