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
文件夹内容如下
执行结果
程序说明
这个一个简单的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
, 可以在这里看到每个软件包的信息。