• cmake 基本命令


    1 # CMake 最低版本号要求
    cmake_minimum_required (VERSION 2.8)

    2 项目信息
    project (Demo2)

    3 aux_source_directory 查找当前目录下的所有源文件并将名称保存到 DIR_SRCS 变量
    aux_source_directory(. DIR_SRCS)

    4 add_executable 工程生成目标文件
    add_executable(Demo ${DIR_SRCS})

    5 target_link_libraries 将若干库链接到目标库文件
    target_link_libraries(myProject comm) # 连接libhello.so库,默认优先链接动态库
    target_link_libraries(myProject libcomm.a) # 显示指定链接静态库
    target_link_libraries(myProject libcomm.so) # 显示指定链接动态库
    target_link_libraries(<name> lib1 lib2 lib3)
    链接的顺序应当符合gcc链接顺序规则,被链接的库放在依赖它的库的后面,即如果上面的命令中,lib1依赖于lib2, lib2又依赖于lib3,则在上面命令中必须严格按照lib1 lib2 lib3的顺序排列,否则会报错
    也可以自定义链接选项, 比如针对lib1使用-WL选项,target_link_libraries(<name> lib1 -WL, lib2 lib3)

    6 add_library 生成静态链接库和动态库
    add_library(libname [SHARED|STATIC] source1 source2 ... sourceN)
    add_library (hello STATIC ${LIBHELLO_SRC}) #生成静态链接库
    add_library (hello SHARED ${LIBHELLO_SRC}) #生成动态链接库

    7 SET_TARGET_PROPERTIES 设置输出别名,所以,希望 "hello_static" 在输出时,不是"hello_static",而是以"hello"的名字显示,故设置如下
    SET_TARGET_PROPERTIES (hello_static PROPERTIES OUTPUT_NAME "hello")
    GET_TARGET_PROPERTY (OUTPUT_VALUE hello_static OUTPUT_NAME) #获取值

    8 include_directories 设置头文件位置,相当于g++ -I,可以用相对货绝对路径,也可以用自定义的变量值
    include_directories(../../../thirdparty/comm/include)

    9 link_directories 添加需要链接的库文件目录,它相当于g++命令的-L选项的作用
    link_directories(directory1 directory2 ...)
    例:link_directories("/home/server/third/lib")

    10 link_libraries 添加需要链接的库文件路径
    语法:
    link_libraries(library1 <debug | optimized> library2 ...)
    # 直接是全路径
    link_libraries(“/home/server/third/lib/libcommon.a”)
    # 下面的例子,只有库名,cmake会自动去所包含的目录搜索
    link_libraries(iconv)
    # 传入变量
    link_libraries(${RUNTIME_LIB})
    # 也可以链接多个
    link_libraries("/opt/MATLAB/R2012a/bin/glnxa64/libeng.so" "/opt/MATLAB/R2012a/bin/glnxa64/libmx.so")

    11 SET_TARGET_PROPERTIES 用来设置输出的名称
    SET_TARGET_PROPERTIES (target1 target2 ...PROPERTIES prop1 value1 prop2 value2 ...)
    SET_TARGET_PROPERTIES (hello PROPERTIES VERSION 1.2 SOVERSION 1) 实现动态库版本号 VERSION指代动态库版本,SOVERSION指代API版本。
    SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello") 将libhello_static.a库名称输出为libhello.a

    12 GET_TARGET_PROPERTY 获取属性值
    GET_TARGET_PROPERTY (VAR target property) VAR:变量 target:目标 property:属性
    GET_TARGET_PROPERTY (OUTPUT_VALUE hello_static OUTPUT_NAME)

    13 MESSAGE 打印cmake时信息
    MESSAGE (STATUS "This is the hello_static OUTPUT_NAME: " ${OUTPUT_VALUE})

    14 add_library 导入已有的库
    add_library(<name> [STATIC | SHARED | MODULE | UNKNOWN] IMPORTED)
    导入了一个已存在的<name>库文件,导入库一般配合set_target_properties使用,这个命令用来指定导入库的路径,比如:
    add_library(test SHARED IMPORTED)
    set_target_properties( test #指定目标库名称
    PROPERTIES IMPORTED_LOCATION #指明要设置的参数
    libs/src/${ANDROID_ABI}/libtest.so #设定导入库的路径)

    15 set
    # 设置可执行文件的输出路径(EXCUTABLE_OUTPUT_PATH是全局变量)
    set(EXECUTABLE_OUTPUT_PATH [output_path])
    # 设置库文件的输出路径(LIBRARY_OUTPUT_PATH是全局变量)
    set(LIBRARY_OUTPUT_PATH [output_path])
    # 设置C++编译参数(CMAKE_CXX_FLAGS是全局变量)
    set(CMAKE_CXX_FLAGS "-Wall std=c++11")
    # 设置源文件集合(SOURCE_FILES是本地变量即自定义变量)
    set(SOURCE_FILES main.cpp test.cpp ...)
    # 设置编译类型debug 或者release。 debug 版会生成相关调试信息,可以使用GDB 进行调试;release不会生成调试信息
    set(CMAKE_BUILE_TYPE DEBUG)
    # 设置编译器的类型
    SET(CMAKE_C_FLAGS_DEBUG “-g -Wall”)
    # 设置低版本g++编译器支持c++11,高版本自动识别
    set(CMAKE_CXX_STANDARD 11)

    需要注意的是,在哪里 ADD_EXECUTABLE 或 ADD_LIBRARY,如果需要改变目标存放路径,就在哪里的上面加入上述的定义

    16 add_subdirectory
    如果当前目录下还有子目录时可以使用add_subdirectory,子目录中也需要包含有CMakeLists.txt
    # sub_dir指定包含CMakeLists.txt和源码文件的子目录位置
    # binary_dir是输出路径, 一般可以不指定
    add_subdirecroty(sub_dir [binary_dir])

    17 文件操作命令file
    # 将message写入filename文件中,会覆盖文件原有内容
    file(WRITE filename "message")
    # 将message写入filename文件中,会追加在文件末尾
    file(APPEND filename "message")
    # 重命名文件
    file(RENAME <oldname> <newname>)
    # 删除文件, 等于rm命令
    file(REMOVE [file1 ...])
    # 创建目录
    file(MAKE_DIRECTORY [dir1 dir2 ...])
    #这个命令将把该目录下及所有子文件夹内的所有后缀为.cpp的文件的路径,全部放入SRC_LIST这个变量中

    file(GLOB_RECURSE SRC_LIST "*.cpp")
    file(GLOB_RECURSE HEADERS "*.h")
    file(GLOB_RECURSE FORMS "*.ui")
    file(GLOB_RECURSE RESOURCES "*.qrc")

    18 set_directory_properties 设置某个路径的一种属性
    set_directory_properties(PROPERTIES prop1 value1 prop2 value2)
    prop1 prop代表属性,取值为:
    INCLUDE_DIRECTORIES
    LINK_DIRECTORIES
    INCLUDE_REGULAR_EXPRESSION
    ADDITIONAL_MAKE_CLEAN_FILES

    19 find_library 查找库所在目录,并将查找到路径放入到变量中
    find_library(RUNTIME_LIB_VAR rt /usr/lib /usr/local/lib NO_DEFAULT_PATH)
    cmake会在目录中查找,如果所有目录中都没有,值RUNTIME_LIB_VAR就会被赋为NO_DEFAULT_PATH

    20 add_definitions
    向 C/C++编译器添加-D 定义,比如:
    add_definitions(-DENABLE_DEBUG -DABC),参数之间用空格分割。
    如果你的代码中定义了#ifdef ENABLE_DEBUG #endif,这个代码块就会生效

    21 add_dependencies
    定义 target 依赖的其他 target,确保在编译本 target 之前,其他的 target 已经被构建。
    add_dependencies(target-name depend-target1
    depend-target2 ...)


    语法说明:
    CMakelist中,命令名字是不区分大小写的,而参数和变量是大小写相关的。
    CMake中使用"#"表示注释该行代码。
    使用${}进行变量的引用
    SET(变量 值) 自定义变量

    变量说明:
    PROJECT_NAME 返回通过 PROJECT 指令定义的项目名称。
    PROJECT_SOURCE_DIR==<projectname>_SOURCE_DIR 指向的是<项目目录>
    PROJECT_BINARY_DIR==<projectname>_BINARY_DIR 指向的是<项目目录>/build目录
    CMAKE_CURRENT_SOURCE_DIR 指的是当前处理的 CMakeLists.txt 所在的路径,比如上面我们提到的 src 子目录
    CMAKE_MODULE_PATH 这个变量用来定义自己的 cmake 模块所在的路径。如果你的工程比较复杂,有可能会自己编写一些 cmake 模块,这些 cmake 模块是随你的工程发布的,为了让 cmake 在处理CMakeLists.txt 时找到这些模块,你需要通过 SET 指令,将自己的 cmake 模块路径设置一下。
    比如:
    SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
    这时候你就可以通过 INCLUDE 指令来调用自己的模块了

        
    # CMake 最低版本号要求
    cmake_minimum_required (VERSION 2.8)
    
    # 项目信息
    project (DEMO)
    # 查找目录下的所有源文件
    # 并将名称保存到 DIR_SRCS 变量
    aux_source_directory(. DIR_SRCS)
    #aux_source_directory(./src DIR_SRCS)
    include_directories(./include)
    # 添加 math 子目录
    SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
    add_subdirectory(src)
    link_libraries(MathFunctions)
    link_directories(/home/qilin64/Documents/work/demo/libs)
    SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
    
    
    # 指定生成目标
    add_executable(Demo ${DIR_SRCS})
    
    # 添加链接库
    #target_link_libraries(Demo MathFunctions)
    

      

    file操作:
    message(STATUS "current dir: ${CMAKE_CURRENT_SOURCE_DIR}")  
    file(WRITE test1.txt "Some messages to Write
    " )  
    file(APPEND test1.txt "Another message to write
    ")  
    file(READ test1.txt CONTENTS LIMIT 4 OFFSET 12)  
    message(STATUS "contents of test1.txt is: 
     ${CONTENTS}")  
    file(MD5 ${CMAKE_CURRENT_SOURCE_DIR}/test1.txt HASH_CONTENTS)  
    message(STATUS "hash contents of test1.txt is: 
     ${HASH_CONTENTS}")  
    file(STRINGS test1.txt PARSED_STRINGS)  
    message(STATUS "
     strings of test1.txt is: 
     ${PARSED_STRINGS}")  
    file(GLOB files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.*")  
    message(STATUS  "files: ${files}")  
    file(MAKE_DIRECTORY dir1 dir2)  
    file(RENAME dir2 dir3)  
    file(REMOVE dir3)  
    file(REMOVE_RECURSE dir3)  
    file(RELATIVE_PATH relative_path ${PROJECT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/test1.txt)  
    message(STATUS "relative path : ${relative_path}")  
    file(TO_CMAKE_PATH "$ENV{PATH}" cmake_path)  
    message(STATUS "cmake path: ${cmake_path}")  
    file(TO_NATIVE_PATH "/usr/local/sbin;/usr/local/bin" native_path)  
    message(STATUS "native path: ${native_path}")  
    file(DOWNLOAD "http://www.baidu.com" ${CMAKE_CURRENT_SOURCE_DIR}/index.html SHOW_PROGRESS)  
    file(COPY test1.txt DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/dir1)  
    file(INSTALL test1.txt DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/dir1) 
  • 相关阅读:
    Light oj 1082 Array Queries(区间最小值)
    Codeforces Round #179 (Div. 2)A、B、C、D
    poj 1976 A Mini Locomotive(01背包)
    Codeforces Round #178 (Div. 2)
    hackerrank challenges median
    poj 1961 Period(kmp最短循环节)
    poj 2182 Lost Cows(树状数组)
    ZOJ1117 POJ1521 HDU1053 Huffman编码
    poj 2352 Stars 树状数组
    这可能是最适合萌新入门Web安全的路线规划
  • 原文地址:https://www.cnblogs.com/whwywzhj/p/10710690.html
Copyright © 2020-2023  润新知