zoukankan      html  css  js  c++  java
  • CMake速记


    title: CMake速记
    date: 2019/11/18 19:17:40
    toc: true

    CMake速记

    我的demo

    #顶层
    cmake_minimum_required(VERSION 3.16)
    PROJECT(DCU)
    
    SET(PLAT_FORM_THIS linux)
    
    SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON)
    if(PLAT_FORM_THIS STREQUAL "linux") 
        SET(PLAT_FORM linux)  
    else()
        SET(PLAT_FORM arm)
        SET(CMAKE_SYSTEM_NAME Linux)
        SET(CMAKE_C_COMPILER "arm-linux-gcc")
        SET(CMAKE_CXX_COMPILER "arm-linux-g++")
    endif() 
    
    
    #SET(CMAKE_SYSTEM_NAME Linux)
    #SET(CMAKE_C_COMPILER "arm-linux-gcc")
    #SET(CMAKE_CXX_COMPILER "arm-linux-g++")
    
    
    SET(INCLUDE_DIR /home/layty/work/pan/dcu-cmake/dcu_ubuntu/dc/include)
    SET(PROJECT_BINARY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/${PLAT_FORM}/)
    
    # 有两个子目录
    ADD_SUBDIRECTORY(third_party)
    ADD_SUBDIRECTORY(dc)
    
    #-------------------------------------------------------------------
    # 子层如果还是目录的话
    ADD_SUBDIRECTORY(task)
    ADD_SUBDIRECTORY(thread)
    #-----------------------------------------------------------------
    # 子层是源文件,生成lib
    INCLUDE_DIRECTORIES(${INCLUDE_DIR})
    # 搜索所有源文件
    AUX_SOURCE_DIRECTORY(. SRC)
    # 这个是生成lib的路径
    SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
    # 生成lib
    ADD_LIBRARY(base SHARED ${SRC})
    #---------------------------------------------------------------
    # 子层是源文件,生成lib
    INCLUDE_DIRECTORIES(${INCLUDE_DIR})
    AUX_SOURCE_DIRECTORY(. SRC)
    SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/)
    
    ADD_EXECUTABLE(xxxexexxx  ${SRC})
    #链接
    # 添加非标准的共享库搜索路径
    LINK_DIRECTORIES(${PROJECT_BINARY_DIR}/${PLAT_FORM}/ ${PROJECT_BINARY_DIR}/${PLAT_FORM}/lib )
    #为 target 添加需要链接的共享库
    TARGET_LINK_LIBRARIES(xxxexexxx  pthread  sqlite3  zlog crypto)
    

    外部构建

    1. mkdir build && cd build
    2. cmake ..
    3. make
    

    内部变量

    PROJECT_BINARY_DIR    构建目录,这里如果是外部构建这里是build
    PROJECT_SOURCE_DIR    还是工程目录,也就是 cmake 后面的 .. 也就是这里是父目录
     
    <projectname>_BINARY_DIR 
    <projectname>_SOURCE_DIR
    

    基础语法

    1. 变量使用${}方式取值,但是在 IF 控制语句中是直接使用变量名
    2. 指令(参数 1 参数 2...)
    3. 指令是大小写无关的,参数和变量是大小写相关的
    4. 工程名(projectname)和可执行的文件名没有什么关系

    常用指令

    https://cmake.org/cmake/help/v3.16/manual/cmake-commands.7.html

    PROJECT(projectname [CXX] [C] [Java])
    
    SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
    
    MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display"...)
    
    ADD_EXECUTABLE (<name> [WIN32] [MACOSX_BUNDLE]
                   [EXCLUDE_FROM_ALL]
                   [source1] [source2 ...])
    
    #添加子目录, binary_dir为在build的重命名的生成目录
    #EXCLUDE_FROM_ALL 参数的含义是将这个目录从编译过程中排除,比如,工程的example,可能就需要工程构建完成后,再进入 example 目录单独进行构建
    add_subdirectory(source_dir [ binary_dir] [EXCLUDE_FROM_ALL])
    
    #指定最终的目标二进制的位置,不包含编译生成的中间文件
    # 使用add_subdirectory 的bin指定的生产的目录下有临时文件 不好看
    # 在哪里 ADD_EXECUTABLE 或 ADD_LIBRARY,如果需要改变目标存放路径,就在哪里加入上述的定义
    # 这样就可以指定多个 exe lib的路径
    SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
    SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
    
    
    install(TARGETS <target>... [...])
    install({FILES | PROGRAMS} <file>... [...])
    install(DIRECTORY <dir>... [...])
    install(SCRIPT <file> [...])
    install(CODE <code> [...])
    install(EXPORT <export-name> [...])
    
    #例子
    
    #cmake -DCMAKE_INSTALL_PREFIX=/usr .
    #CMAKE_INSTALL_PREFIX 的默认定义是/usr/local
    # ${CMAKE_INSTALL_PREFIX}/<DESTINATION 定义的路径>
    INSTALL(TARGETS targets...
    	[[ARCHIVE|LIBRARY|RUNTIME]  # .a,.so,.o
    		[DESTINATION <dir>]		# 安装的路径,/开头为绝对路径,如果要使用CMAKE_INSTALL_PREFIX 指定则要用相对路径
    		[PERMISSIONS permissions...]
    		[CONFIGURATIONS
    	[Debug|Release|...]]
    		[COMPONENT <component>]
    		[OPTIONAL]
    	] [...])
    # 例子
    INSTALL(TARGETS myrun mylib mystaticlib
    RUNTIME DESTINATION bin
    LIBRARY DESTINATION lib
    ARCHIVE DESTINATION libstatic
    )
    # 可执行二进制 myrun 安装到${CMAKE_INSTALL_PREFIX}/bin 目录
    # 动态库 libmylib 安装到${CMAKE_INSTALL_PREFIX}/lib 目录
    # 静态库 libmystaticlib 安装到${CMAKE_INSTALL_PREFIX}/libstatic 目录
    
    
    # EXCLUDE_FROM_ALL 参数的意思是这个库不会被默认构建,除非有其他的组件依赖或者手工构建。
    add_library(<name> [STATIC | SHARED | MODULE]
                [EXCLUDE_FROM_ALL]
                [source1] [source2 ...])
                
    # 设置输出目标的属性            
    SET_TARGET_PROPERTIES(target1 target2 ...PROPERTIES prop1 value1 prop2 value2 ...)    
    #例子 将hello_static 的名字改为hello
    ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})
    SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")
    # cmake 在构建一个新的 target 时,会尝试清理掉其他使用这个名字的库,因为,在构建 libhello.a 时,就会清理掉 libhello.so.
    # 为了避免清理,需要再设置 CLEAN_DIRECT_OUTPUT 属性
    SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1)
    SET_TARGET_PROPERTIES(hello_static PROPERTIES CLEAN_DIRECT_OUTPUT1)
    
    
    # 获得目标属性,变量存在VAR 如果没有这个属性定义,则返回 NOTFOUND
    GET_TARGET_PROPERTY(VAR target property)
    
    # 设置版本号
    SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)
    
    #头文件,默认追加在后面
    #1,CMAKE_INCLUDE_DIRECTORIES_BEFORE,通过 SET 这个 cmake 变量为 on,可以将添加的头文件搜索路径放在已有路径的前面。
    #2,通过 AFTER 或者 BEFORE 参数,也可以控制是追加还是置前。
    INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)
    
    
    #链接
    # 添加非标准的共享库搜索路径
    LINK_DIRECTORIES(directory1 directory2 ...)
    #为 target 添加需要链接的共享库
    TARGET_LINK_LIBRARIES(target library1 <debug | optimized> library2...)
    
    # ldd src/main 查看结果
    
    #链接到静态库 加入.a
    TARGET_LINK_LIBRARIES(main libhello.a)
    
    # 当前目录的所有文件
    AUX_SOURCE_DIRECTORY(dir VARIABLE)
    
    
    

    环境变量

    CMAKE_INCLUDE_PATH 
    CMAKE_LIBRARY_PATH
    
    export 使用或者
    CMAKE_INCLUDE_PATH=/home/include cmake ..
    
    
    内部这么使用 hello.h 
    # FIND_PATH 用来在指定路径中搜索文件名
    # #FIND_PATH(myHeader NAMES hello.h PATHS /usr/include/usr/include/hello)
    FIND_PATH(myHeader hello.h)
    IF(myHeader)
    INCLUDE_DIRECTORIES(${myHeader})
    ENDIF(myHeader)
    
    同样的 CMAKE_LIBRARY_PATH 可以用在 FIND_LIBRARY 中
    

    一些变量

    CMAKE_CURRENT_SOURCE_DIR  #指的是当前处理的 CMakeLists.txt 所在的路径
    CMAKE_CURRRENT_BINARY_DIR #target 编译目录,ADD_SUBDIRECTORY(src bin)可以更改这个变量的值
    CMAKE_CURRENT_LIST_FILE  #输出调用这个变量的 CMakeLists.txt 的完整路径
    CMAKE_CURRENT_LIST_LINE  #输出这个变量所在的行
    EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH #分别用来重新定义最终结果的存放目录,前面我们已经提到了这两个变量。
    PROJECT_NAME  #返回通过 PROJECT 指令定义的项目名称
    

    参考文档

  • 相关阅读:
    vscode 自动换行 关闭
    QGIS geojson 矢量操作 稀释 抽稀 压缩 边界抽稀
    vscode 关闭烦人的 tooltip 提示
    sql函数汉字转拼音
    sql 排名函数
    客户端文件下载 download.js
    Oracle 创建 DBLink 的方法
    RDLC分组序号
    sql server中使用函数验证身份证号码是否合法
    oracle导出数据库exp时报错,ORA12154 TNS: 无法解析指定的连接标识符
  • 原文地址:https://www.cnblogs.com/zongzi10010/p/11884510.html
Copyright © 2011-2022 走看看