原連結:(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
檔案夾内容如下
執行結果
程式說明
這個一個簡單的
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
, 可以在這裡看到每個軟體包的資訊。