Navigation

    蓝鲸ROS机器人论坛

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

    Linux常见编译系统总结

    技术交流
    ros教程
    1
    1
    3540
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • weijiz
      weijiz last edited by weijiz

      在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, 可以在这里看到每个软件包的信息。

      1 Reply Last reply Reply Quote 0
      • 1 / 1
      • First post
        Last post
      Copyright © 2015-2023 BlueWhale community