天天看点

Linux常见编译系统总结

原链接:(http://community.bwbot.org/topic/183)[http://community.bwbot.org/topic/183]

运行测试平台:小强ROS机器人

在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
           

文件夹内容如下

Linux常见编译系统总结

执行结果

Linux常见编译系统总结

程序说明

这个一个简单的

CMakeLists.txt

文件,没有涉及到软件依赖的问题。CMake的强大之处就是其软件包管理能力。具体的使用方法可以看这篇文章

autotools

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

./configure
make
make install
           

这种方式使用的就是autotools

还是以一个hello world为例。创建一个

configure.ac

文件,文件内容入下

AC_INIT([helloworld], [0.1], [[email protected]]) # 指定项目名称, 版本号, 项目管理人员
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

, 可以在这里看到每个软件包的信息。

继续阅读