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 

  1. # 在一个CMake项目里
  2. $ mkdir build
  3. $ cd build
  4. $ cmake ..
  5. $ make
  6. $ make install  # (可选)

2) catkin_make 的流程

[cpp] view plain copy 

  1. # In a catkin workspace
  2. $ catkin_make
  3. $ catkin_make install  # (可选)
  4. 如果源码不在默认工作空间,需要指定编译路径:
  5. # In a catkin workspace
  6. $ catkin_make --source my_src
  7. $ 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

原文地址:https://www.cnblogs.com/klb561/p/9142549.html

时间: 2024-10-12 03:20:00

make cmake catkin_make的相关文章

(ros/catkin) &#215;&#215;/&#215;&#215;.h: No such file or directory

操作系统:ros(indigo)/ubuntu14.04编译工具:cmake(catkin_make) 出现错误:robot_control/src/robot_control.cpp:9:62: fatal error: robot_control/robot_control.h: No such file or directory #include<robot_control/robot_control.h> 出现此错误时,有三种可能情况: 1. 此.h文件是由自定义消息生成的,如robo

CMake error:System Error:No such file or directory CMake error:Could not open file for write in copy operation xxxx.ros_Config.cmake.tmp.

微型电脑或嵌入式与电脑还是有点不同的,在微型电脑上ros indigo 版本下利用catkin编译如果你遇到如下错误: CMake error:System Error:No such file or directory CMake error:Could not open file for write in copy operation xxxx.ros_Config.cmake.tmp. CMake error:at /opt/ros/indigo/share/catkin/cmake/ca

关于catkin_make xbo_face_msgs

可以catkin_make xbo_face_msgs_gencpp   单独编译生成 可以作为依莱库在后台生成. http://answers.ros.org/question/52744/how-to-specify-dependencies-with-foo_msgs-catkin-packages/ How to specify dependencies with "foo_msgs" catkin packages catkin messages services asked

catkin_make 浅析

引用自http://blog.csdn.net/zyh821351004/article/details/50388429 update:   catkin_tools --------------------------------- Catkin Command Line Tools: Installing catkin_tools:   sudo apt-get install python-catkin-tools CLI Comparison:catkin_make /catkin_m

catkin_make时报错找不到custom include custom.h

参考:https://answers.ros.org/question/195467/catkin-unable-to-include-custom-libraries/ 报错内容:/home/zhanghu/catkin_ws/src/map_img_proccess/src/map_img_load.cpp:1:26: fatal error: map_img_load.h: 没有那个文件或目录 #include "map_img_load.h" 解决办法: You should

realsense D435安装时出现Invoking &quot;cmake&quot; failed,not found ddynamic_reconfigure etc.

根据链接 https://blog.csdn.net/sinat_23853639/article/details/88044019 安装 安装ROS包的时候,catkin_make clean 出现Invoking "cmake" failed的错误. 提示not found  ddynamic_reconfigure etc. 主要是因为没有安装ddynamic_reconfigure的package 通过链接https://github.com/pal-robotics/ddyn

catkin_make及cmakelists分析

catkin_make编译时,对工作空间所有packages的编译顺序是按拓扑遍历的,不是按字母也不是按创建时间. 单独编译某个package 以前一直认为单独编译某个package的命令是catkin_make --pkg package1,结果这样仍然会将工作空间中所有package的CMakeLists全检查一遍,花费时间相当长,实际的命令是这个: 1 catkin_make -DCATKIN_WHITELIST_PACKAGES="package1;package2" 可以编译

-- Could not find the required component &#39;pcl_ros&#39;. The following CMake error indicates that you either

安装雷达驱动过程中遇到的问题,走一步坑一步 ~/robosense$ catkin_makeBase path: /home/leo2/robosenseSource space: /home/leo2/robosense/srcBuild space: /home/leo2/robosense/buildDevel space: /home/leo2/robosense/develInstall space: /home/leo2/robosense/install######## Runni

哪位大兄弟有用 cMake 开发Android ndk的

一直用 Android studio 开发ndk,但是gradle支持的不是很好,只有experimental 版本支持 配置各种蛋疼.主要每次新建一个module都要修改配置半天.之前也看到过google 开发文档有提到 cmake 但是一直没用.哪位大兄弟用过,说下经验 哪位大兄弟有用 cMake 开发Android ndk的 >> android 这个答案描述的挺清楚的:http://www.goodpm.net/postreply/android/1010000007205830/哪位