CMakeLists.txt 文件&范例

CMakeLists.txt 文件
 前的项目代码在src 目录。 src 下有子目录:server, utility, lib, bin, build

      server-----  存放项目的主功能类文件
      utility  -----  存放项目要用到相关库文件,便已成为库文件存放到子目录lib 中
      lib      -----  存放utility 生成的库
      bin     -----  存放association 生成的二进制文件
      build  -----  编译目录,存放编译生成的中间文件

 
cmake 要求工程主目录和所有存放源代码子目录下都要编写CMakeLists.txt 文件,注意大小写(cm 大写,list中l 大写且落下s).

 
src/CMakeLists.txt 文件如下:
      -------------------------------------------------------------------------------------------------------------
      #author:
      #created:
 
      CMAKE_MINIMUM_REQUIRED(VERSION 2.8)               #cmake 最低版本要求,低于2.6 构建过程会被终止。 
      PROJECT(server_project)                                             #定义工程名称
 
      MESSAGE(STATUS "Project: SERVER")                       #打印相关消息消息 
      MESSAGE(STATUS "Project Directory: ${PROJECT_SOURCE_DIR}")
 
      SET(CMAKE_BUILE_TYPE DEBUG)                             #指定编译类型
      SET(CMAKE_C_FLAGS_DEBUG "-g -Wall")                #指定编译器 
      ADD_SUBDIRECTORY(utility)                                      #添加子目录 
      ADD_SUBDIRECTORY(server)
    -------------------------------------------------------------------------------------------------------------

 相关解释:
      1. CMakeLists.txt 文件中不区分大小写
      2. PROJECT(project_name)    定义工程名称
          语法:project(projectname [cxx] [c] [java])
          可以指定工程采用的语言,选项分别表示:C++, C, java, 如不指定默认支持所有语言
      3. MESSAGE(STATUS, "Content")  打印相关消息
          输出消息,供调试CMakeLists.txt 文件使用。
      4. SET(CMAKE_BUILE_TYPE DEBUG)  设置编译类型debug 或者release。 debug 版会生成相关调试信息,可以使用GDB 进行 
          调试;release不会生成调试信息。当无法进行调试时查看此处是否设置为debug.
      5. SET(CMAKE_C_FLAGS_DEBUG "-g -Wall") 设置编译器的类型
          CMAKE_C_FLAGS_DEBUG            ----  C 编译器
          CMAKE_CXX_FLAGS_DEBUG        ----  C++ 编译器
       6. ADD_SUBDIRECTORY(utility) 添加要编译的子目录
           为工程主目录下的存放源代码的子目录使用该命令,各子目录出现的顺序随意。
       如上便是工程server_project 主目录src 下的CMakeLists.txt 文件,下一篇我们解释子目录utiltiy中的CMakeLists.txt 文件。


 
子目录utility 下的CMakeLists.txt 文件如下:
--------------------------------------------------------------------------------------------------------------------
     #Cmake file for library utility.a
     #Author:  
     #Created: 

     SET(SOURCE_FILES                                  #设置变量,表示所有的源文件
             ConfigParser.cpp
             StrUtility.cpp
             )

     INCLUDE_DIRECTORIES(                          #相关头文件的目录
              /usr/local/include
              ${PROJET_SOURCE_DIR}/utility
     )

    LINK_DIRECTORIES(                                  #相关库文件的目录
             /usr/local/lib
    )

    ADD_LIBRARY(association ${SOURCE_FILES})           #生成静态链接库libassociation.a
    TARGET_LINK_LIBRARY(association core)                #依赖的库文件
    
    SET_TARGET_PROPERTIES(utility  PROPERTIES      #表示生成的执行文件所在路径
    RUNTIME_OUTPUT_DIRECTORY> "${PROJECT_SOURCE_DIR}/lib")

--------------------------------------------------------------------------------------------------------------------
    相关解释:
    1. SET(SOURCE_FILES .....)  
    表示要编译的源文件,所有的源文件都要罗列到此处。set 设置变量,变量名SOURCE_FILES自定义。
    2. INCLUDE_DIRECTORY(...)  
    include头文件时搜索的所有目录
    变量PROJECT_SOURCE_DIR 表示工程所在的路径,系统默认的变量
    3. LINK_DIRECTORIES(...)
     库文件存放的目录,在程序连接库文件的时候要再这些目录下寻找对应的库文件
    4. ADD_LIBRARY(...) 
     表示生成静态链接库libassociaiton.a,由${PROJECT_SOURCE_DIR}代表的文件生成。
     语法:ADD_LIBRARY(libname [SHARED|STATIC]
     SHARED 表示生成动态库, STATIC表示生成静态库。
    5. TARGET_LINK_LIBRARY(association core) 
     表示库association 依赖core库文件
     6. SET_TARGET_PROPERTIES
     设置编译的库文件存放的目录,还可用于其他属性的设置。如不指定,
     生成的执行文件在当前编译目录下的各子目录下的build目录下,好拗口!简单一点:
     如指定在: ./src/lib 下
     不指定在: ./src/build/utility/build 目录下
     生成的中间文件在./src/build/utilty/build 目录下,不受该命令额影响




     子目录server 下的CMakeLists.txt 文件:
    --------------------------------------------------------------------------------------------
     SET(SOURCE_FILES
             Gassociation.cpp
             ConfigurationHandler.cpp
     )

     INCLUDE_DIRECTORIES(
               /usr/local/include
              ${PROJECT_SOURCE_DIR}/utility
              ${PROJECT_SOURCE_DIR}/association
     )

     LINK_LIBRARIES(
                 /usr/local/lib
                 ${PROJECT_SOURCE_DIR}/lib
     )

     ADD_EXECUTABLE(server  ${SOURCE_FILES})

     TARGET_LINK_LIBRARIES(server
                                                 utility
     )
     SET_TARGET_PROPERTIES(server  PROPERTIES    #表示生成的执行文件所在路径
     RUNTIME_OUTPUT_DIRECTORY  "${PROJECT_SOURCE_DIR}/bin")
     -------------------------------------------------------------------------------------------------------
     相关解释:
     1. ADD_EXECUTABLE()     #指定要生成的执行文件的名称server
        其他用法同utilty/CMakeLists.txt
     2. SET_TARGET_PROPERTIES
      设置生成的执行文件存放的路径,
      注意:
      执行文件server 依赖的子目录utility 子目录生成的静态库libutility.a,在指定的时候要写成:
      TARGET_LINK_LIBRARIES(server   utility)
      而不能写成:
      TARGET_LINK_LIBRARIES(server   libutility.a)
      否则编译总会提示找不到libutility库文件。
      但使用第三方的库却要指定成具体的库名,如:libACE-6.0.0.so
      这一点很诡异,暂时还没找到原因。

      完成对应的CMakeLists.txt 文件编写后,便可以进行编译了。
      编译:
            进入 ./src/build
            执行cmake ..
            make


Cmakelist范例
  SET(PROJECT_NAME Sophus)
 
PROJECT(${
PROJECT_NAME
})
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
 
SET (CMAKE_VERBOSE_MAKEFILE ON)
 
# Release by default
# Turn on Debug with "-DCMAKE_BUILD_TYPE=Debug"
IF( NOT CMAKE_BUILD_TYPE )
    SET( CMAKE_BUILD_TYPE Release )
ENDIF()
 
IF (CMAKE_COMPILER_IS_GNUCXX )
    SET(CMAKE_CXX_FLAGS_DEBUG  "-O0 -g" )
    SET(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG " )
 
   ADD_DEFINITIONS("-Wall -Werror -Wno-unused-variable
                    -Wno-unused-but-set-variable -Wno-unknown-pragmas ")
ENDIF()
 
################################################################################
# Add local path for finding packages, set the local version first
set( CMAKE_MODULE_PATH "${
CMAKE_SOURCE_DIR
}/cmake_modules" )
list( APPEND CMAKE_MODULE_PATH "${
CMAKE_ROOT
}/Modules" )
 
################################################################################
# Create variables used for exporting in SophusConfig.cmake
set( Sophus_LIBRARIES "" )
set( Sophus_INCLUDE_DIR ${
PROJECT_SOURCE_DIR
} )
 
################################################################################
 
include(FindEigen3.cmake)
#find_package( Eigen3 REQUIRED )
INCLUDE_DIRECTORIES( ${
EIGEN3_INCLUDE_DIR
} )
SET( Sophus_INCLUDE_DIR ${
Sophus_INCLUDE_DIR
} ${
EIGEN3_INCLUDE_DIR
} )
 
SET (SOURCE_DIR "sophus" )
 
SET (TEMPLATES tests
                so2
                se2
                so3
                se3
                rxso3
                sim3
)
 
SET (SOURCES ${
SOURCE_DIR
}/sophus.hpp)
 
FOREACH(templ ${
TEMPLATES
})
   LIST(APPEND SOURCES ${
SOURCE_DIR
}/${
templ
}.hpp)
ENDFOREACH(templ)
 
 
INCLUDE_DIRECTORIES(${
INCLUDE_DIRS
})
 
# Added ${
SOURCES
} to executables so they show up in QtCreator (and possibly
# other IDEs).
# ADD_EXECUTABLE(test_so2 sophus/test_so2.cpp ${
SOURCES
})
# ADD_EXECUTABLE(test_se2 sophus/test_se2.cpp ${
SOURCES
})
# ADD_EXECUTABLE(test_so3 sophus/test_so3.cpp ${
SOURCES
})
# ADD_EXECUTABLE(test_se3 sophus/test_se3.cpp ${
SOURCES
})
# ADD_EXECUTABLE(test_rxso3 sophus/test_rxso3.cpp ${
SOURCES
})
# ADD_EXECUTABLE(test_sim3 sophus/test_sim3.cpp ${
SOURCES
})
# ENABLE_TESTING()
#
# ADD_TEST(test_so2 test_so2)
# ADD_TEST(test_se2 test_se2)
# ADD_TEST(test_so3 test_so3)
# ADD_TEST(test_se3 test_se3)
# ADD_TEST(test_rxso3 test_rxso3)
# ADD_TEST(test_sim3 test_sim3)
 
################################################################################
# Create the SophusConfig.cmake file for other cmake projects.
CONFIGURE_FILE( ${
CMAKE_CURRENT_SOURCE_DIR
}/SophusConfig.cmake.in
     ${
CMAKE_CURRENT_BINARY_DIR
}/SophusConfig.cmake @ONLY IMMEDIATE )
export( PACKAGE Sophus )
 
INSTALL(DIRECTORY sophus DESTINATION ${
CMAKE_INSTALL_PREFIX
}/include
         FILES_MATCHING PATTERN "*.hpp" )

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
修改CMakeLists.txt文件是在ROS package中进行配置和构建的重要步骤之一。下面是修改CMakeLists.txt文件的一般步骤: 1. 打开CMakeLists.txt文件:在你的ROS package目录中找到CMakeLists.txt文件,并使用文本编辑器打开它。 2. 添加依赖项:如果你的ROS package依赖于其他的ROS package,你需要在CMakeLists.txt文件中添加这些依赖项。你可以使用`find_package()`函数来查找和链接这些依赖项。例如,如果你的package依赖于roscpp和std_msgs,你可以在CMakeLists.txt文件中添加以下代码: ```cmake find_package(catkin REQUIRED COMPONENTS roscpp std_msgs) ``` 3. 设置编译选项:你可以在CMakeLists.txt文件中设置一些编译选项,例如编译标志、编译器选项等。你可以使用`add_compile_options()`函数来设置这些选项。例如,如果你想添加一些编译标志,你可以在CMakeLists.txt文件中添加以下代码: ```cmake add_compile_options(-std=c++11 -Wall -Wextra) ``` 4. 添加可执行文件或库:如果你的ROS package包含可执行文件或库,你需要在CMakeLists.txt文件中添加它们。你可以使用`add_executable()`函数来添加可执行文件,使用`add_library()`函数来添加库。例如,如果你想添加一个名为"my_node"的可执行文件,你可以在CMakeLists.txt文件中添加以下代码: ```cmake add_executable(my_node src/my_node.cpp) target_link_libraries(my_node ${catkin_LIBRARIES}) ``` 5. 添加其他必要的配置:根据你的需求,你可能需要添加其他的配置,例如消息生成、服务生成等。这些配置可以根据你的ROS package的具体需求来进行添加。 6. 保存并关闭文件:完成所有的修改后,保存并关闭CMakeLists.txt文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值