cmake如何写

来源:互联网 发布:模具编程软件 编辑:程序博客网 时间:2024/05/17 06:29
cmake中一些预定义变量
1,PROJECT_SOURCE_DIR 工程的根目录
2,PROJECT_BINARY_DIR 运行cmake命令的目录,通常是${PROJECT_SOURCE_DIR}/build#新建了一个build文件夹
3,CMAKE_INCLUDE_PATH #include头文件包含目录
4,CMAKE_LIBRARY_PATH #lib文件目录
5,CMAKE_CURRENT_SOURCE_DIR 当前处理的CMakeLists.txt所在的路径
6,CMAKE_CURRENT_BINARY_DIR target编译目录
   使用ADD_SURDIRECTORY(src bin)可以更改此变量的值
   SET(EXECUTABLE_OUTPUT_PATH <新路径>)并不会对此变量有影响,只是改变了最终目标文件的存储路径
7,CMAKE_CURRENT_LIST_FILE 输出调用这个变量的CMakeLists.txt的完整路径
8,CMAKE_CURRENT_LIST_LINE 输出这个变量所在的行
9,CMAKE_MODULE_PATH 定义自己的cmake模块所在的路径
   SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake),然后可以用INCLUDE命令来调用自己的模块
10,EXECUTABLE_OUTPUT_PATH 重新定义目标二进制可执行文件的存放位置
11,LIBRARY_OUTPUT_PATH 重新定义目标链接库文件的存放位置
12,PROJECT_NAME 返回通过PROJECT指令定义的项目名称
13,CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS 用来控制IF ELSE语句的书写方式




1,CMakelist中,命令名字是不区分大小写的,而参数和变量是大小写相关的
2,CMake中使用"#"表示注释该行代码。
3,与其他语言编程语言不同的是,CMake脚本的语法中没有赋值操作,无论是赋值,还是比较、判断操作,都是通过内置命令来完成的,例如"set(),math()等"。
4,所有的内置命令调用形式为:

command(arg1 arg2 arg3 ... argn)
5,  常用命令
5.1,message():显示一个消息。
     使用方法:message("Hello world");
5.2,cmake_minimum_required():需要的最低版本;这个写在文件的最开始的地方
      使用方法 cmake_minimum_required(version 2.6)
5.3,project():项目的名称
      使用方法:project(hello)
5.4,set():Cmake中的赋值操作都是通过这个来做的。
      使用方法: SET(HELLO_SRCS  Hello.c Hello.cpp  world.c   world.cpp),
       如果是多个数据,变量自动变成了list形式,
    可以通过foreach( F ${HELLO_SRCS} )
               message(${F})
               endforeach(${F})的方式来遍历
     
5.5, add_definitions():设置编译选项;
     使用方法:ADD_DEFINITIONS(-DENABLE_DEBUG -DABC),参数之间用空格分隔
5.6, subdirs():CMake 是以递归的方式工作;处理完当前目录,再去 SUBDIRS 中的目录
5.7, add_library() :生成一个链接库;
5.8, add_executable():添加生成文件;如:ADD_EXECUTABLE (Hello ${HELLO_SRCS})
5.9, add_dependencies():包含一个依赖库文件夹;即输出目录
5.10,add_subdirectory():向当前工程添加存放源文件的子目录;
      使用方法:ADD_SUBDIRECTORY(src_dir [binary_dir] [EXCLUDE_FROM_ALL])
   #EXCLUDE_FROM_ALL含义:将这个目录从编译过程中排除
      使用SET命令重新定义EXECUTABLE_OUTPUT_PATH和LIBRARY_OUTPUT_PATH变量来指定最终的二进制文件的位置
   SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
      SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
     
5.11,aux_source_directory ():现一个目录下所有的源代码文件并将列表存储在一个变量中
      使用方法:AUX_SOURCE_DIRECTORY( ../../common      PROJ_SRC_COMMON_LIST )#将所有的cpp文件放入了后面的变量中
5.12,include_directories():  指明头件的搜索路径;vs的包含目录
       使用方法:include_directories( ../../third-part/DCMTK/include 
                                      ../../third-part/jpegsr6/include)#可以多级添加
5.13,set_target_properties():设置输出的名称,设置动态库的版本和API版本。
      使用方法:set_target_properties( libname PROPERTIES DEBUG_OUTPUT_NAME      release_name )#release版本
                set_target_properties( libname PROPERTIES RELEASE_OUTPUT_NAME    debug_name  )#debug版本
5.14,source_group():当文件都在同一个路径下面使用
5.15,ADD_LIBRARY()生成可执行文件
       使用方法:add_library( libname SHARED  [EXCLUDE_FROM_ALL] ${PROJ_SRC_LIST} ${PROJ_QRC_LIST} )
    参数为:生成文件的名,SHARED动态库,STATIC静态库,
    MODULE 在使用dyld的系统有效,若不支持dyld,等同于SHARED,${PROJ_SRC_LIST} ${PROJ_QRC_LIST}需要的文件
    EXCLUDE_FROM_ALL 表示该库不会被默认构建
5.16,LINK_DIRECTORIES();在项目中添加lib库的链接路径
       使用方法:link_directories( ${PROJECT_SOURCE_DIR}/../../third-part/DCMTK/lib )
5.17,TARGET_LINK_LIBRARIES()为target添加需要链接的库
       使用方法:TARGET_LINK_LIBRARIES( ${PROJECT_SOURCE_DIR}/../../third-part/DCMTK/lib )
5.18,ADD_DEPENDENCIES()定义target依赖的其他target,确保target在构建之前,其依赖的target已经构建完毕
       使用方法:ADD_DEPENDENCIES(target-name depend-target1 depend-target2 …)
5.19, EXEC_PROGRAM()用于在指定目录运行某个程序
      EXEC_PROGRAM(Executable [dir where to run] [ARGS <args>][OUTPUT_VARIABLE <var>] [RETURN_VALUE <value>])
      使用方法:EXEC_PROGRAM(ls ARGS "*.c" OUTPUT_VARIABLE LS_OUTPUT RETURN_VALUE LS_RVALUE)









0 0
原创粉丝点击