CMakeLists.txt 文件理解

转自:https://blog.csdn.net/xuehuafeiwu123/article/details/53929834

CMakeLists.txt 文件
为 CMake build 文件。是 CMake 编译系统中软件包的输入。描述如何编译代码、安装到哪里。

http://wiki.ros.org/catkin/CMakeLists.txt

CMakeLists.txt 格式:

1、Required CMake Version (cmake_minimum_required)
2、Package Name (project())
3、Find other CMake/Catkin packages needed for build (find_package())
4Message/Service/Action Generators (add_message_files(), add_service_files(), add_action_files())
5、Invoke message/service/action generation (generate_messages())
6、Specify package build info export (catkin_package())
7、Libraries/Executables to build (add_library()/add_executable()/target_link_libraries())
8、Tests to build (catkin_add_gtest())
9Install rules (install())

 
 

    1、CMake Version:
    每一个 catkin CMakeLists.txt 必须以 CMake 需要的版本开始,Catkin 需要版本 2.8.3 或者更高

    cmake_minimum_required(VERSION 2.8.3)
    
     
     

      2、Package name:
      CMake project function 指定的文件名。

      project(robot_brain)
      
       
       

        在 CMake script 文件中,引用 CMake package 可以使用变量 ${PROJECT_NAME}

        3、依赖功能包:

        寻找需要用到的其他 CMake packages,用函数 find_package。
        至少依赖一个关于 catkin 的功能包

        find_package(catkin REQUIRED)
        
         
         

          如果要使用 C++ 和 Boost,则需要引用 find_package 包含 Boost,并且指明 Boost 的类型,如使用 Boost threads,则:

          find_package(Boost REQUIRED COMPONENTS thread)
          
           
           

            4、catkin_package()

            catkin_package() 是 catkin 支持的 CMake 宏指令。用来向编译系统指明 catkin-specific 的信息,而编译系统来生成 pkg-config and CMake files。

            该函数必须用在用 add_library() or add_executable() 声明之前。
            有5个可选参数:

            INCLUDE_DIRS - The exported include paths (i.e. cflags) for the package
            LIBRARIES - The exported libraries from the project
            CATKIN_DEPENDS - Other catkin projects that this project depends on
            DEPENDS - Non-catkin CMake projects that this project depends on
            CFG_EXTRAS - Additional configuration options
            
             
             

              例子:

              catkin_package(
                 INCLUDE_DIRS include
                 LIBRARIES ${PROJECT_NAME}
                 CATKIN_DEPENDS roscpp nodelet
                 DEPENDS eigen opencv)
              
               
               

                5、Specifying Build Targets

                目标文件有两种:
                1)、EXE 文件
                2)、库文件

                目标命名:
                注意:必须唯一
                重命名用 set_target_properties() 函数,在编译和安装输出中,把目标文件名 rviz_image_view 改为 image_view 如下:

                set_target_properties(rviz_image_view
                                      PROPERTIES OUTPUT_NAME image_view
                                      PREFIX "")
                
                 
                 

                  自定义输出路径:

                  目标文件的默认路径有时候必须改为自定义的路径。自定义的路径中,有一些默认的规则。如包含 Python bindings 的库文件必须将路径设置为 Python 的可 importable 文件夹。

                  set_target_properties(python_module_library
                    PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CATKIN_DEVEL_PREFIX}/${CATKIN_PACKAGE_PYTHON_DESTINATION})
                  
                   
                   

                    Include Paths and Library Paths

                    Include Paths - 头文件路径
                    Library Paths - 库文件路径
                    include_directories(<dir1>, <dir2>, ..., <dirN>)
                    link_directories(<dir1>, <dir2>, ..., <dirN>)
                    
                     
                     

                      include_directories() 的参数形如 *_INCLUDE_DIRS,变量为 find_package 路径和其他需要包含的路径。例如,使用 catkin and Boost ,形式如下

                      include_directories(include ${Boost_INCLUDE_DIRS} ${catkin_INCLUDE_DIRS})
                      

                      link_directories() 用来加载外加的库函数路径。 catkin and CMake packages 是 find_packaged 时会自动加载链接信息。

                      link_directories(~/my_libs)
                      
                       
                       
                      • 1
                      • 2

                      Executable Targets
                      将 src/main.cpp src/some_file.cpp src/another_file.cpp 编译为文件 myProgram :

                      add_executable(myProgram src/main.cpp src/some_file.cpp src/another_file.cpp)
                      
                       
                       
                      • 1
                      • 2

                      Library Targets

                      添加默认共享库

                      add_library(${PROJECT_NAME} ${${PROJECT_NAME}_SRCS})
                      

                      target_link_libraries
                      用在 add_executable() 之后

                      add_executable(foo src/foo.cpp)
                      add_library(moo src/moo.cpp)
                      target_link_libraries(foo moo)  -- This links foo against libmoo.so
                      

                      6)、Messages, Services, and Action Targets

                      处理 messages, services, and actions 的宏有三个:

                      add_message_files
                      add_service_files
                      add_action_files
                      

                      这些宏的后面必须有调用生成的宏

                      generate_messages()
                      

                      这些宏必须在 catkin_package() 之前使用:

                      
                      find_package(catkin REQUIRED COMPONENTS ...)
                       add_message_files(...)
                       add_service_files(...)
                       add_action_files(...)
                       generate_messages(...)
                       catkin_package(...)
                       ...
                      

                      必须为 CATKIN_DEPENDS 添加依赖项 message_runtime :

                      
                      catkin_package(
                       ...
                       CATKIN_DEPENDS message_runtime ...
                       ...)
                      
                       
                       

                        必须 find_package 文功能包 message_generation,单独或者作为 catkin 的组件。

                        find_package(catkin REQUIRED COMPONENTS message_generation)
                        

                        另外,package.xml 需包含 build dependency on message_generation 和 runtime dependency on message_runtime。

                        如果目标文件包含其他目标文件,而这些目标文件需要 messages/services/actions 进行编译,则需添加
                        add_dependencies(some_target ${catkin_EXPORTED_TARGETS})
                        some_target 是用 add_executable() 添加的目标的名字

                        如果你的功能包编译 messages and/or services as well as executables 时需要用到这些宏,则
                        add_dependencies(some_target {{{PROJECT_NAME}_EXPORTED_TARGETS})
                        some_target 是用 add_executable() 添加的目标的名字

                        如果你的功能包同时满足上述条件,则
                        add_dependencies(some_target $PROJECTNAMEEXPORTEDTARGETS$PROJECTNAMEEXPORTEDTARGETS{catkin_EXPORTED_TARGETS})

                        例子:

                        msg:”MyMessage1.msg” and “MyMessage2.msg”
                        depend: std_msgs and sensor_msgs
                        srv: “MyService.srv”

                        # Get the information about this package's buildtime dependencies
                          find_package(catkin REQUIRED
                            COMPONENTS message_generation std_msgs sensor_msgs)
                        
                          # Declare the message files to be built
                          add_message_files(FILES
                            MyMessage1.msg
                            MyMessage2.msg
                          )
                        
                          # Declare the service files to be built
                          add_service_files(FILES
                            MyService.srv
                          )
                        
                          # Actually generate the language-specific message and service files
                          generate_messages(DEPENDENCIES std_msgs sensor_msgs)
                        
                          # Declare that this catkin package's runtime dependencies
                          catkin_package(
                           CATKIN_DEPENDS message_runtime std_msgs sensor_msgs
                          )
                        
                          # define executable using MyMessage1 etc.
                          add_executable(message_program src/main.cpp)
                          add_dependencies(message_program ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
                        
                          # define executable not using any messages/services provided by this package
                          add_executable(does_not_use_local_messages_program src/main.cpp)
                          add_dependencies(does_not_use_local_messages_program ${catkin_EXPORTED_TARGETS})
                        

                        如果,编译 actionlib actions,需添加 actionlib_msgs 到 find_packaged 的关于 catkin 的组件中,并在 generate_messages(…) 之前添加如下代码:

                        add_action_files(FILES
                          MyAction.action
                        )
                        

                        7)、Unit Tests

                        catkin_add_gtest(myUnitTest test/utest.cpp)

                        8)、可选项:Installable Targets

                        CMake install() 函数参数

                        TARGETS - which targets to install
                        ARCHIVE DESTINATION - Static libraries and DLL (Windows) .lib stubs
                        LIBRARY DESTINATION - Non-DLL shared libraries and modules
                        RUNTIME DESTINATION - Executable targets and DLL (Windows) style shared libraries
                        

                        例子:

                        install(TARGETS ${PROJECT_NAME}
                          ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
                          LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
                          RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
                        )
                        

                        python包必须被安装到能够被引用的路径

                        install(TARGETS python_module_library
                          ARCHIVE DESTINATION ${CATKIN_PACKAGE_PYTHON_DESTINATION}
                          LIBRARY DESTINATION ${CATKIN_PACKAGE_PYTHON_DESTINATION}
                        )
                        

                        安装 Python Executable Scripts

                        catkin_install_python(PROGRAMS scripts/myscript
                          DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})
                        

                        安装头文件

                        install(DIRECTORY include/${PROJECT_NAME}/
                          DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
                          PATTERN ".svn" EXCLUDE
                        )
                        
                        install(DIRECTORY include/
                          DESTINATION ${CATKIN_GLOBAL_INCLUDE_DESTINATION}
                          PATTERN ".svn" EXCLUDE
                        )
                        

                        安装 roslaunch Files or Other Resources

                        install(DIRECTORY launch/
                          DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/launch
                          PATTERN ".svn" EXCLUDE)
                        
                        # install moveit plugin description file
                        install(FILES robot_moveit_plugins.xml
                          DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
                        
                        					<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-7f770a53f2.css" rel="stylesheet">
                                    </div>
                        
                        • 0
                          点赞
                        • 1
                          收藏
                          觉得还不错? 一键收藏
                        • 0
                          评论
                        评论
                        添加红包

                        请填写红包祝福语或标题

                        红包个数最小为10个

                        红包金额最低5元

                        当前余额3.43前往充值 >
                        需支付:10.00
                        成就一亿技术人!
                        领取后你会自动成为博主和红包主的粉丝 规则
                        hope_wisdom
                        发出的红包
                        实付
                        使用余额支付
                        点击重新获取
                        扫码支付
                        钱包余额 0

                        抵扣说明:

                        1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
                        2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

                        余额充值