• cmake的使用笔记


    一.

     cmake使用网上还蛮多的。可是当你自己去用的时候,才觉得,都不是你想要的。

    自己做个记录,用法全是基本用法。


    二.

     我在里面直接写注释说明了,直接贴了。


    1.

    #cmake 
    
    #1.
    #
    cmake_minimum_required(VERSION 2.8.2 FATAL_ERROR)
    # 解决方案名称
    project(real_ex)
    
    #设置宏定义,在VS的属性页--》配置属性--》C/C++-->预处理项--》预处理器定义中有sss_STATIC这个预定义。
    add_definitions(-Dsss_STATIC)
    
    # 设置解决方案二进制生成路径,即debug和release路径
    set(REAL_ex_EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR})
    # 设置包含路径
    set(REAL_ex_INCLUDE_PATH ${PROJECT_SOURCE_DIR}/include)
    # 这样也包括源码。
    set(REAL_ex_SOURCE_PATH ${PROJECT_SOURCE_DIR}/src)
    
    #添加当前级别目录下的子文件夹
    add_subdirectory(src)
    
    

    2.

    #2.
    # 宏定义,实现包含多个文件夹路径,使用方法:rw_include_module(file_a file_b)
    macro(rw_include_module)
    	foreach(module ${ARGN})
    		include_directories(${REAL_ex_INCLUDE_PATH}/rw_modules/${module})
    	endforeach()
    endmacro(rw_include_module)
    
    #宏定义,包含头文件和链接lib库。
    macro(rw_include_runtime_library)
    	foreach(library ${ARGN})
    		include_directories(${REAL_ex_INCLUDE_PATH}/${library})
    		target_link_libraries(${PROJECT_NAME} ${library})
    	endforeach()
    endmacro(rw_include_runtime_library)

    3.

    #添加所有源文件,可定义文件格式。
    #说明一下:GLOB_RECURSE
    #file(GLOB_RECURSE variable [RELATIVE path]
    #       [FOLLOW_SYMLINKS] [globbingexpressions]...)
    #GLOB_RECURSE 与GLOB类似,区别在于它会遍历匹配目录的所有文件以及子目录下面的文件。
    #对于属于符号链接的子目录,只有FOLLOW_SYMLINKS指定一或者cmake策略CMP0009没有设置为NEW时,才会遍历这些目录。
    #
    #GLOB的使用方法:
    # file(GLOB variable [RELATIVE path] [globbingexpressions]...)
    #
    #GLOB 会产生一个由所有匹配globbing表达式的文件组成的列表,并将其保存到变量中。
    #Globbing 表达式与正则表达式类似,但更简单。如果指定了RELATIVE 标记,
    #返回的结果将是与指定的路径相对的路径构成的列表。 (通常不推荐使用GLOB命令来从源码树中收集源文件列表。
    #原因是:如果CMakeLists.txt文件没有改变,
    #即便在该源码树中添加或删除文件,产生的构建系统也不会知道何时该要求CMake重新产生构建文件。
    macro(rw_module_source_all)
    	file(GLOB_RECURSE rw_module_source_list . "*.cpp" "*.c" "*.h" "*.hpp" "*.inl")
    	aux_source_directory(. rw_module_source_list)
    endmacro(rw_module_source_all)
    
    

    4.

    #下面这个没有成功,说是可以设置vs上的工程下添加自己想要的文件夹(也就是VS项目中添加的筛选器) #set_target_properties(${PROJECT_NAME} PROPERTIES FOLDER ${REAL_ex_MODULES_PROJECT_FOLDER}) #工程生成动态链接库。 add_library(${PROJECT_NAME} SHARED ${rw_module_source_list}) #编译生成静态链接库。 add_library(${PROJECT_NAME} STATIC ${rw_module_source_list})

    5.

    #文件拷贝,这个找了好久,一开始不会用,试过install和configure_file.
    #配置文件拷贝:  configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${filename} ${CMAKE_CURRENT_BINARY_DIR})
    # 发现configure_file拷贝后文件要么是0K,要么是1K,比较小。自己不会用。
    #  文件拷贝:FILE(COPY ${CMAKE_CURRENT_SOURCE_DIR}/glut32Copy.lib DESTINATION ${CMAKE_BINARY_DIR}/Debug)
    #
    # 摘抄一段说明:
    # configure_file: 将一份文件拷贝到另一个位置并修改它的内容。
    #  configure_file(<input> <output>
                    #[COPYONLY] [ESCAPE_QUOTES] [@ONLY])
    #将文件<input>拷贝到<output>然后替换文件内容中引用到的变量值。
    #如果<input>是相对路径,它被评估的基础路径是当前源码路径。<input>必须是一个文件,而不是个路径。
    #如果<output>是一个相对路径,它被评估的基础路径是当前二进制文件路径。
    #如果<output>是一个已有的路径,那么输入文件将会以它原来的名字放到那个路径下。
    # 该命令替换掉在输入文件中,以${VAR}格式或@VAR@格式引用的任意变量,如同它们的值是由CMake确定的一样。
    #如果一个变量还未定义,它会被替换为空。如果指定了COPYONLY选项,那么变量就不会展开。
    #如果指定了ESCAPE_QUOTES选项,那么所有被替换的变量将会按照C语言的规则被转义。该文件将会以CMake变量的当前值被配置。
    #如果指定了@ONLY选项,只有@VAR@格式的变量会被替换而${VAR}格式的变量则会被忽略。
    #这对于配置使用${VAR}格式的脚本文件比较有用。
    #任何类似于#cmakedefine VAR的定义语句将会被替换为#define VAR或者/* #undef VAR */,视CMake中对VAR变量的设置而定。
    #任何类似于#cmakedefine01 VAR的定义语句将会被替换为#define VAR 1或#define VAR 0,视VAR被评估为TRUE或FALSE而定。
    
    #(configure_file的作用是让普通文件也能使用CMake中的变量。——译注)
    
    macro(rw_copy_file_to_build_project)
        foreach(filename ${ARGN})
    		FILE(COPY ${CMAKE_CURRENT_SOURCE_DIR}/${filename} DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
    	endforeach()
    endmacro(rw_copy_file_to_build_project)
    
    
    

    6.

    # 收集所有所有子文件夹中的CMakeLists.txt,到制定的变量中。
    file(GLOB_RECURSE rw_module_cmake_list . "CMakeLists.txt")
    
    # 遍历添加子文件夹的源码
    foreach(rw_module_cmake ${rw_module_cmake_list})
    	string(LENGTH ${PROJECT_SOURCE_DIR} module_prefix_length)
    	string(SUBSTRING ${rw_module_cmake} ${module_prefix_length} -1 rw_module_name)
    	string(SUBSTRING ${rw_module_name} 1 -1 rw_module_name)
    	string(FIND ${rw_module_name} "/" rw_module_name_length)
    
    	if(NOT (${rw_module_name_length} STREQUAL -1))
    		string(SUBSTRING ${rw_module_name} 0 ${rw_module_name_length} rw_module_name)
    		set(rw_current_module_name ${rw_module_name})
    		add_subdirectory(${rw_module_name})
    	endif()
    endforeach()
    




    目前项目中使用的一些,都是比较基础的东西。若有不足之处,请各位不吝赐教。



    完毕!

  • 相关阅读:
    机会主义和理想主义
    从 http://snowolf.iteye.com/blog/735294 收藏 Java加密技术(十二)——*.PFX(*.p12)&个人信息交换文件
    Demystifying ‘Sys is undefined’
    server.mappath
    C# 发送http请求的几类方法
    几款用于防破解的软件
    机器学习之嵌套交叉验证
    机器学习之生成多项式和交互特征
    机器学习之调参
    dataframe列联表等操作
  • 原文地址:https://www.cnblogs.com/qitian1/p/6461985.html
Copyright © 2020-2023  润新知