天天看點

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

, 可以在這裡看到每個軟體包的資訊。

繼續閱讀