make cmake catkin_make


Linux下進行C語言編程,必然要采用GNU GCC來編譯C源代碼生成可執行程序。

一、GCC快速入門

Gcc指令的一般格式為:Gcc [選項] 要編譯的文件 [選項] [目標文件]

其中,目標文件可缺省,Gcc默認生成可執行的文件名為:a.out

然后輸入./a.out 便可運行得到結果

二、GCC的命令剖析--四步走

GCC編譯C源碼有四個步驟:

預處理-----> 編譯 ----> 匯編 ----> 鏈接

    1.預處理,生成預編譯文件(.i文件):

        Gcc –E hello.c –o hello.i
    2.編譯,生成匯編代碼(.s文件):

        Gcc –S hello.i –o hello.s
    3.匯編,生成目標文件(.o文件):
        Gcc –c hello.s –o hello.o
    4.鏈接,生成可執行文件:
        Gcc hello.o –o hello

 整個過程如果想一步到位:

       gcc hello.c -o hello

 

    gcc簡介
    Linux系統下的gcc(GNU C Compiler)是GNU推出的功能強大、性能優越的多平台編譯器,是GNU的代表作品之一。gcc是可以在多種硬體平台上編譯出可執行程序的超級編譯 器,其執行效率與一般的編譯器相比平均效率要高20%~30%。gcc編譯器能將C、C++語言源程序、匯程式化序和目標程序編譯、連接成可執行文件,如 果沒有給出可執行文件的名字,gcc將生成一個名為a.out的文件。在Linux系統中,可執行文件沒有統一的后綴,系統從文件的屬性來區分可執行文件 和不可執行文件。而gcc則通過后綴來區別輸入文件的類別,下面我們來介紹gcc所遵循的部分約定規則。
    .c為后綴的文件,C語言源代碼文件;
    .a為后綴的文件,是由目標文件構成的檔案庫文件;
    .C,.cc或.cxx 為后綴的文件,是C++源代碼文件;
    .h為后綴的文件,是程序所包含的頭文件;
    .i 為后綴的文件,是已經預處理過的C源代碼文件;
    .ii為后綴的文件,是已經預處理過的C++源代碼文件;
    .m為后綴的文件,是Objective-C源代碼文件;
    .o為后綴的文件,是編譯后的目標文件;
    .s為后綴的文件,是匯編語言源代碼文件;
    .S為后綴的文件,是經過預編譯的匯編語言源代碼文件

 

1.gcc是GNU Compiler Collection(就是GNU編譯器套件),也可以簡單認為是編譯器,它可以編譯很多種編程語言(括C、C++、Objective-C、Fortran、Java等等)。

2.當你的程序只有一個源文件時,直接就可以用gcc命令編譯它。

3.但是當你的程序包含很多個源文件時,用gcc命令逐個去編譯時,你就很容易混亂而且工作量大

4.所以出現了make工具
make工具可以看成是一個智能的批處理工具,它本身並沒有編譯和鏈接的功能,而是用類似於批處理的方式—通過調用makefile文件中用戶指定的命令來進行編譯和鏈接的。

5.makefile是什么?簡單的說就像一首歌的樂譜,make工具就像指揮家,指揮家根據樂譜指揮整個樂團怎么樣演奏,make工具就根據makefile中的命令進行編譯和鏈接的。

6.makefile命令中就包含了調用gcc(也可以是別的編譯器)去編譯某個源文件的命令。

7.makefile在一些簡單的工程完全可以人工手下,但是當工程非常大的時候,手寫makefile也是非常麻煩的,如果換了個平台makefile又要重新修改。

8.這時候就出現了Cmake這個工具,cmake就可以更加簡單的生成makefile文件給上面那個make用。當然cmake還有其他功能,就是可以跨平台生成對應平台能用的makefile,你不用再自己去修改了。

9.可是cmake根據什么生成makefile呢?它又要根據一個叫CMakeLists.txt文件(學名:組態檔)去生成makefile。

10.到最后CMakeLists.txt文件誰寫啊?親,是你自己手寫的。

11.當然如果你用IDE,類似VS這些一般它都能幫你弄好了,你只需要按一下那個三角形

12.接着是qmake,qmake是什么,先說一下Qt這個東西。Qt是跨平台C++圖形用戶界面應用程序開發框架。它既可以開發GUI程序,也可用於開發非GUI程序,比如控制台工具和服務器。簡單的說就是C++的第三方庫,使用這個庫你可以很容易生成windows,Linux,MAC os等等平台的圖形界面。現在的Qt還包含了開發各種軟件一般需要用到的功能模塊(網絡,數據庫,XML,多線程啊等等),比你直接用C++(只帶標准內褲那種)要方便和簡單。

13.你可以用Qt簡簡單單就實現非常復雜的功能,是因為Qt對C++進行了擴展,你寫一行代碼,Qt在背后幫你寫了幾百上千行,而這些多出來的代碼就是靠Qt專有的moc編譯器(The Meta-Object Compiler)和uic編譯器(User Interface Complier)來重新翻譯你那一行代碼。問題來了,你在進行程序編譯前就必須先調用moc和uic對Qt源文件進行預處理,然后再調用編譯器進行編譯。上面說的那種普通makefile文件是不適用的,它沒辦法對qt源文件進行預處理。所以qmake就產生了。

14.qmake工具就是Qt公司制造出來,用來生成Qt 專用makefile文件,這種makefile文件就能自動智能調用moc和uic對源程序進行預處理和編譯。qmake當然必須也是跨平台的,跟cmake一樣能對應各種平台生成對應makefile文件。

15.qmake是根據Qt 工程文件(.pro)來生成對應的makefile的。工程文件(.pro)相對來說比較簡單,一般工程你都可以自己手寫,但是一般都是由Qt的開發環境 Qt Creator自動生成的,你還是只需要按下那個邪惡三角形就完事了。

16.還沒有完,由於qmake很簡單很好用又支持跨平台,而且是可以獨立於它的IDE,所以你也可以用在非Qt工程上面,照樣可以生成普通的makefile,只要在pro文件中加入CONFIG -= qt 就可以了。

17. 這樣qmake和cmake有什么區別?
不好意思,cmake也是同樣支持Qt程序的,cmake也能生成針對qt 程序的那種特殊makefile,
只是cmake的CMakeLists.txt 寫起來相對與qmake的pro文件復雜點。
qmake 是為 Qt 量身打造的,使用起來非常方便,但是cmake功能比qmake強大。
一般的Qt工程你就直接使用qmake就可以了,cmake的強大功能一般人是用不到的。
當你的工程非常大的時候,又有qt部分的子工程,又有其他語言的部分子工程,據說用cmake會 方便,我也沒試過。
 
------------------------------------------------------------- ROS編譯:catkin簡析 ---------------------------------------------

1.  catkin_make 與cmake的關系

    程序在cmake編譯是這樣的流程, cmake指令依據你的CMakeLists.txt 文件,生成makefiles文件,make再依據此makefiles文件編譯鏈接生成可執行文件.

catkin_make是將cmake與make的編譯方式做了一個封裝的指令工具, 規范了工作路徑與生成文件路徑.

1)  cmake標准流程 

[cpp]  view plain  copy 在CODE上查看代碼片派生到我的代碼片
  1. # 在一個CMake項目里  
  2. $ mkdir build  
  3. $ cd build  
  4. $ cmake ..  
  5. $ make  
  6. $ make install  # (可選)  

2) catkin_make 的流程

[cpp]  view plain  copy 在CODE上查看代碼片派生到我的代碼片
  1. # In a catkin workspace  
  2. $ catkin_make  
  3. $ catkin_make install  # (可選)  
  4.   
  5.   
  6. 如果源碼不在默認工作空間,需要指定編譯路徑:  
  7.   
  8. # In a catkin workspace  
  9. $ catkin_make --source my_src  
  10. $ catkin_make install --source my_src  # (optionally)

1、在ros下創建工作空間:

mkdir -p catkin_ws/src  

cd src catkin_init_workspace cd .. catkin_make 

2、創建功能包 
方法一:利用catkin創建package

cd ~/catkin_ws/src catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
  • 1
  • 2

創建程序包的一般格式是catkin_create_pkg ,此命令的格式包括功能包名稱和依賴項,在上面示例中,依賴項包括std_msg、rospy和roscpp。 
運行上面命令之后,在src文件夾下會生成一個與功能包名同名的文件夾,在該文件夾下有如下文件(夾)

workspace_folder/
                 src/
                      package_name/   
                                include                   --文件夾 src --文件夾 CMakeLists.txt package.xml 
  • 1

方法二:利用roscreate創建package

cd ~/catkin_ws/src roscreate-pkg beginner_tutorials std_msgs rospy roscpp
  • 1
  • 2

同樣的,利用rosmake創建程序包的格式是roscreate-pkg ,此命令的格式也包括功能包名稱和依賴項。 
運行上面命令之后,在src文件夾下會生成一個與功能包名同名的文件夾,在該文件夾下有如下文件(夾)

workspace_folder/
                 src/
                      package_name/   
                                include --文件夾 src --文件夾 CMakeLists.txt manifest.xml mainpage.dox Makefile
  • 1

3、編譯功能包 
方法一:利用catkin編譯 
用catkin編譯的是上述第一種利用catkin創建的package,首先修改創建功能包時生成的CMakeLists.test文件,用gedit打開該文件, 
⑴添加以下語句來查找添加的依賴包

find_package(catkin REQUIRED COMPONENTS sensor_msgs cv_bridge image_transport) find_package(OpenCV 2 REQUIRED) find_package(PLC REQUIRED)
  • 1

⑵添加以下語句來添加參與編譯的節點程序

add_executable(node name src/node program)#添加可執行節點 target_link_libraries(node name ${catkin_LIBRARIES})#鏈接庫 add_dependencies(node name package name_generator_messages_cpp)#為可執行文件添加對生成的消息文件的依賴,因為catkin把所有的package並行的編譯,所以如果你要使用其他catkin工作空間中其他package的消息,你同樣也需要添加對他們各自生成的消息文件的依賴,感覺就是一個先導入頭文件的過程。
  • 1

除了可以在創建功能包時添加系統提供的依賴(catkin_create_pkg beginner_tutorials std_msgs rospy roscpp),也可以修改創建功能包時生成的package.xml文件,以圖像處理中所需用到的包為例,加入了以下指令來說明后面增加的依賴包

<run_depend>sensor_msgs</run_depend> <run_depend>image_transport</run_depend> <run_depend>cv_bridge</run_depend> 
  • 1

利用catkin編譯的方法是:

#under workspace catkin_make [make_targets] [-DCMAKE_VARIABLES=...]
  • 1

方法二:利用rosmake編譯 
用rosmake編譯的是上述第二種利用roscreate創建的package,同樣的,在編譯之前,需要修改CMakeLists.txt文件和manifest.xml文件,不同的地方是在修改CMakeLists.txt文件時需要加上如下語句來添加參與編譯的節點程序:

rosbuild_add_executable(node_name src/node_name.cpp)
  • 1

注意: 
ROS從indigo開始就不再把opencv作為系統依賴包而是作為一個第三方包引入,如果直接使用會在rosmake編譯階段報錯,no exist package “opencv2”,此時只需要在CMakeLists.txt中添加find_package(OpenCV 2 REQUIRED),然后在manifest.xml中不能添加依賴包,此處添加的為系統依賴包。 
利用rosmkae編譯的方法是:

#under workspace rosmake package_name
  • 1運行以上命令之后,如果編譯沒有出錯,在bin文件夾下可以看到生成的可執行文件,可以直接運行./node_name來運行節點。 

3、運行編譯完成之后的節點(不用launch,還不懂)

rosrun package_name node_name
  • 1注意: 

1)創建功能包是在src目錄下,而編譯功能包是在workspace目錄下。 
2)編譯之前要先確保添加了當前工作空間的path,查看方法是:

echo $ROS_PACKAGE_PATH
  • 1添加方法是source setup.bash文件
#under the path: workspace source ./devel/setup.bash

3)運行節點之前要下roscore


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM