源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

cmake 学习笔记

  • 时间:2020-09-16 08:11 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:cmake 学习笔记
最近接触到一些工程上的代码,都是用cmake来编译的,每次看着CMakeLists.txt 就各种懵逼,决定从0 开始学习 [b]1 set[/b]
set(var hello)
message(${var})

输出 [code]hello[/code] 其实并不是单单输出hello,还有很多其他信息,会生成很多文件 files [b]2 CMAKE_C(XX)_FLAGS[/b] 变量 CMAKE_C_FLAGS 存放的内容会被传给 C 编译器,作用在所有的编译组态上。如果希望只针对特定一种组态有效,可以设定 CMAKE_C_FLAGS_<编译组态>,例如 CMAKE_C_FLAGS_RELEASE、CMAKE_C_FLAGS_DEBUG。 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}     -Wall -O3 -march=native -Wno-reorder") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -O3 -march=native -Wno-reorder") 编译选项为-Wall O3的优化 其他内部变量: •CMAKE_C_COMPILER:指定C编译器 •CMAKE_CXX_COMPILER: •CMAKE_C_FLAGS:编译C文件时的选项,如-g;也可以通过add_definitions添加编译选项 •EXECUTABLE_OUTPUT_PATH:可执行文件的存放路径 •LIBRARY_OUTPUT_PATH:库文件路径 •CMAKE_BUILD_TYPE::build 类型(Debug, Release, ...), •CMAKE_BUILD_TYPE=Debug •BUILD_SHARED_LIBS:Switch between shared and static libraries 内置变量的使用: •在CMakeLists.txt中指定,使用set •cmake命令中使用,如cmake -DBUILD_SHARED_LIBS=OFF [b]3 CHECK_CXX_COMPILER_FLAG[/b] 检查CXX编译器是否支持给定的flag 必须先include(CheckCXXCompilerFlag) include(CheckCXXCompilerFlag) CHECK_CXX_COMPILER_FLAG(<flag> <var>) e.g.
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++0x"COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX11)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
  add_definitions(-DCOMPILEDWITHC11)
  message(STATUS "Using flag -std=c++11.") 
elseif(COMPILER_SUPPORTS_CXX0X)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
  add_definitions(-DCOMPILEDWITHC0X)
  message(STATUS "Using flag -std=c++0x.")
else()
  message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
endif()
上面的代码很直接 就是在检查当前编译器是否支持c++11 CHECK_CXX_COMPILER_FLAG 赋值给的var是个bool型 [b]4 add_definitions[/b] 添加编译参数 add_definitions(-DDEBUG) 将在gcc命令行添加DEBUG 宏定义 ,那么你就可以在你的源文件里面对DEBUG宏来操作 [b]5 ENV[/b] 语法:   $ENV(VAR)# 读取环境变量 VAR,也可用set对其赋值 eg: IF(DEFINED ENV{ARM_ARCHITECTURE})#如果是arm的机器 [b]6 list[/b] List 操作
list(LENGTH <list> <output variable>)
list(GET <list> <element index> [<element index> ...]
   <output variable>)
list(APPEND <list> [<element> ...])
list(FIND <list> <value> <output variable>)
list(INSERT <list> <element_index> <element> [<element> ...])
list(REMOVE_ITEM <list> <value> [<value> ...])
list(REMOVE_AT <list> <index> [<index> ...])
list(REMOVE_DUPLICATES <list>)
list(REVERSE <list>)
list(SORT <list>)
APPEND 追加元素,懂了吧,这些都是list的操作 [b]7 CMAKE_MODULE_PATH[/b] cmake 进行搜索的modules的list, 它是一个list [b]8 find_package[/b] 这个有点复杂,还是直接看官方文档 还有这个 [b]9 include_directories[/b] 增加头文件的搜索路径,相当于指定gcc的-I参数 include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...]) [b]10 add_library[/b] add_library(<name> [STATIC | SHARED | MODULE]             [EXCLUDE_FROM_ALL]             source1 [source2 ...]) 增加库的目录 [b]11 target_link_libraries[/b] target_link_libraries(<target> [item1 [item2 [...]]]                       [[debug|optimized|general] <item>] ...) 指令 target_link_libraries()用于指定 target 所需要链接的库,还可以有不同的选项。 e.g.
target_link_libraries(myapp
  debug -labc
  optimized -lxyz
  )
myapp 在 debug build 时会链接 libabc.a,在 release build 时会链接 libxyz.a,他们的目录被add_library命令添加进去了 [b]12 add_executable[/b] 增加可执行文件(从源文件) add_executable(<name> [WIN32] [MACOSX_BUNDLE]                [EXCLUDE_FROM_ALL]                source1 [source2 ...]) e.g.
add_executable(stereo_euroc Examples/Stereo/stereo_euroc.cc)
target_link_libraries(stereo_euroc ${PROJECT_NAME})

stereo_euroc 是要生成的可执行文件,源码是后面的.cc文件,链接后面的库
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部