zoukankan      html  css  js  c++  java
  • 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()
    




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



    完毕!

  • 相关阅读:
    使用CustomValidate自定义验证控件
    C#中金额的大小写转换
    Andriod出错之Unable to build: the file dx.jar was not loaded from the SDK folder!
    VC 编写的打字练习
    机房工作笔记Ping只有单向通
    web服务协同学习笔记(1)
    Dll 学习3 将MDI子窗口封装在DLL中
    机房工作学习文件共享
    Andriod出错之Failed to find an AVD compatible with target 'Android 2.2'
    Andriod出错之wrapper was not properly loaded first
  • 原文地址:https://www.cnblogs.com/qitian1/p/6461985.html
Copyright © 2011-2022 走看看