zoukankan      html  css  js  c++  java
  • Android:cmake开发指南

    一、静态库与动态库构建

      (.so)共享库,shared object:节省空间,在运行时去连接,如果执行机器上没有这些库文件就不能执行。
      (.a)静态库,archive:静态库和程序化为一体,不会分开。
      通过 ldd命令可以查看一个可执行程序所依赖的的共享库。
      使用环境变量LD_LIBRARY_DIRECTORY可以指定共享库位置
     

     1.编译共享库:

    ADD_LIBRARY(hello SHARED ${SHARED_LIBRARY})
     2.添加静态库
    ADD_LIBRARY(hello STATIC ${STATIC_LIBRARY})

      因为默认规则是不能有相同名字的共享库与静态库,所以当生成静态库的时候,共享库会被删除,所以需要通过SET_TARGET_PROPERTIES()来解决这个问题,例子:

    SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")

      cmake在构建一个target的时候,会删除之前生成的target,一样是通过设置SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1)来达到目的。

     3.动态库的版本号:
      同样是通过SET_TARGET_PROPERTIES()来设置
    SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)
      VERSION:动态库版本
      SOVERSION:API版本
     

    二、静态库与动态库构建常用变量和常用环境变量

     1.变量的引用

      使用“${}”,在IF中,不需要使用这种方式,直接使用变量名即可。

     2.自定义变量

      使用SET(OBJ_NAME xxxx),使用时${OBJ_NAME}  

     3.cmake的常用变量

    CMAKE_BINARY_DIR,PROJECT_BINARY_DIR,_BINARY_DIR

      这三个变量内容一致,如果是内部编译,就指的是工程的顶级目录,如果是外部编译,指的就是工程编译发生的目录。

    CMAKE_SOURCE_DIR,PROJECT_SOURCE_DIR,_SOURCE_DIR

      这三个变量内容一致,都指的是工程的顶级目录。

    CMAKE_CURRENT_BINARY_DIR:外部编译时,指的是target目录,内部编译时,指的是顶级目录
    CMAKE_CURRENT_SOURCE_DIR:CMakeList.txt所在的目录
    CMAKE_CURRENT_LIST_DIR:CMakeList.txt的完整路径
    CMAKE_CURRENT_LIST_LINE:当前所在的行
    CMAKE_MODULE_PATH:如果工程复杂,可能需要编写一些cmake模块,这里通过SET指定这个变量
    LIBRARY_OUTPUT_DIR,BINARY_OUTPUT_DIR:库和可执行的最终存放目录 
    PROJECT_NAME:工程名字

     4.cmake中调用环境变量

      (1)使用 $ENV{NAME} : 调用系统环境变量,同样可以用 SET(ENV{NAME} value) 设置环境变量,注意 "ENV" 不带 "$"。

      (2)CMAKE_INCLUDE_CURRENT_DIR 等于 INCLUDE_DIRECTORY(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})

     5.其他的内置变量

      (1)BUILD_SHARED_LIBS : 使用ADD_LIBRARY()时设置默认值

      (2)CMAKE_C_FLAGS : 为c编译器设置编译参数

      (3)CMAKE_CXX_FLAGS :  为c++编译器设置编译参数

     6.区分debug和release

       通过 ${CMAKE_BUILD_TYPE} 变量判断当前是"Release" 还是 "Debug" 版本编译。

     7.指定编译32bit或64bit程序

    SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32")
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")

    三、常用指令

     1.基本指令

    INCLUDE_DIRECTORIES(${includedir}) #-I。
    LINK_DIRECTORIES(${libdir}) #-L
    TARGET_LINK_LIBRARIES(helloworld ${linkflags}) #-l
    ADD_DEFINITIONS(${cflags}) #-D
     ADD_DEFINATIONS:向C/CPP添加宏定义,相当于gcc中的-D,参数之间用空格分割
     ADD_DEPENDICIES(target_name, depend_name):定义target对其他target的依赖关系
     AUX_SOURCE_DIRECTORY(dir VARIBLE):把目录下的所有源文件保存在变量中,基本用来创建源文件列表
     ADD_EXECUTABLE:指定目录,生成执行文件
     
     EXEC_PROGRAM:外部调用指令,可移执行任何外部命令,后面加参数,例子如下:
     EXEC_PROGERAM(ls ARGS"*.c" OUTPUT_VARIBLE LS_OUTPUT RETURN_VALUE LS_RVALUE)
     IF(not LS_RVALUE)
      MESSAGE(STATUS "xxx")
     ENDIF(not LS_RVAULE)
     PS:这里执行ls *.c指令,执行成功的话,返回0。

     2.FILE指令

    FILE(WRITE file_name "content")
    FILE(APPEND file_name "content")
    FILE(READ file_name varible)
    FILE(WRITE file_name "content")

    # 查找当前目录下的所有源文件
    set(CURR_DIR ${CMAKE_CURRENT_LIST_DIR}/)
    file(GLOB_RECURSE SOURCE_FILES ${CURR_DIR} ${CURR_DIR}/*.cpp ${CURR_DIR}/*.c)

     3.FIND_系列指令

    LIBRARY( name path):
    FIND_LIBRARY(Xorg X11 /usr/lib64)
    IF(not Xorg)
    MESSAGE(STATUS "no Xorg")
    ENDIF(not Xorg)
    FILE( name path)
    PATH( name path)
    PROGRAM( name path)
    PACKAGE( [major.minor][QUIET][NO MODULE][[REQUIRED][COMPONTS][componts....]])
    最后一条,用来调用放在CMAKE_MODULE_PATH下的Find.cmake模块,也可以自定义Find模块
    首先通过SET(CMAKE_MODULE_PATH /home/...)来指定位置

     4.控制指令

    IF(expression),ELSE(expression),ENDIF(expression)
    express举例:
    否定:空,0,N,NO,OFF,FALSE,NOTFOUND或_NOTFOUND
    肯定:COMMAND cmd,EXISTS dir/file,variable MARCHES regex等等

    示例:
    IF (${CMAKE_BUILD_TYPE} STREQUAL "Debug")
    message(WARNING "++++++ Debug ++++++++")
    ENDIF(${CMAKE_BUILD_TYPE} STREQUAL "Debug")

     5.循环指令

      (1) 循环添加依赖的静态库

    set(LIB_BASE mpkernel mputility mpstream)
    
    foreach(lib ${LIB_BASE})
        add_library(${lib} STATIC IMPORTED)
        set_property(TARGET ${lib} PROPERTY IMPORTED_LOCATION ${LIB_BASE_DIR}/lib${lib}.a)
    endforeach()

     (2)循环拷贝动态库到工程目录,打包到APK。

    set(BOKEHPP_SHARED_LIBS dualcam_bokeh bokehplus_image )

    foreach
    (lib ${BOKEHPP_SHARED_LIBS}) set(THE_LIBRARY ${BOKEHPP_SHARED_LIBS}/lib${lib}.so) add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD # Adds a post-build event to ${PROJECT_NAME} COMMAND ${CMAKE_COMMAND} -E copy_if_different # which executes "cmake - E copy_if_different..." ${THE_LIBRARY} # <--this is in-file $<TARGET_FILE_DIR:${PROJECT_NAME}> # <--this is out-file path ) endforeach()

    四、模块的使用和自定义模块

      FIND_PACKAGE

      每一个模块都会产生如下变量
        _FOUND
        _INCLUDE_DIR
        _LIBRARY or _LIBRARIES

      如果_FOUND为真,把_INCLUDE_DIR加入到INCLUDE_DIRECTORIES中,_LIBRARY加入到TARGET_LINK_LIBRARIES中。

      编写属于自己的FindHello模块:
    1.FIND_PATH(HELLO_INCLUDE_DIR hello.h /usr/include/hello /usr/local/include/hello)
    2.FIND_LIBRARY(HELLO_LIBRARY_DIR NAMES hello PATH /usr/lib /usr/local/lib)
      IF(HELLO_INCLUDE_DIR AND HELLO_LIBRARY)
      SET(HELLO_FOUND TRUE)
      ENDIF(HELLO_INCLUDE_DIR)
    3.FIND_PACKAGE([major.minor][QUIET][NO_MODULE]
    [[REQUIRED|COMPONENTS][componets...]])
    QUIET参数:去掉输出信息
    REQUIRED参数:共享库是否是工程必须的,如果是必须的,那么找不到
    如果在src中想调用hello模块中的内容
    FIND_PACKAGE(HELLO)
    为了可以让工程找到FindHELLO.cmake
    在主工程的CMakeList.txt中,SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_PATH}/cmake)
    通过设置FIND_PACKAGE(HELLO QUIET)可以去掉输出信息

    五、系统默认变量和内置变量

     1.在不同的平台编译的时候,会用到一些系统内置的变量,比如操作系统名称,版本号之类:
    CMAKE_SYSTEM:系統全名,如 "Linux-2.4.22""FreeBSD-5.4-RELEASE""Windows 5.1"
    CMAKE_SYSTEM_NAME:系統名称,如 "Linux", "FreeBSD" or "Windows",注意大小写
    CMAKE_SYSTEM_VERSION:只显示系统全名中的版本部分
    CMAKE_SYSTEM_PROCESSOR:CPU名称
     2.系统标志:
      下面的变量都是BOOL类型的,如果与当前系统或编译器相符,值为True,反之为False
    UNIX
    WIN32 for MINGW,CYGWIN,MSYS
    APPLE
    BORLAND
    WATCOM
    MSVC,MSVC_IDE,CMAKE_COMPILER_2005,MSVC60/70/71/80/90/10,针对不同的Visual C++
    CMAKE_COMPILER_IS_GUNCXX/CMAKE_COMPILER_IS_GUNCC
     3.编译时选项
    BUIlD_SHARED_LIBS:将所有程序库的target设置成共享库
    CMAKE_BUIlD_TYPE:控制构建类型,以下为可选参数
    None:default;Debug:生成调试信息;Release:发布版本,进行最佳化,需要注意这个值不会在configure的时候自动初始化,需要手动指定
    CMAKE_C_FLAGS
    CMAKE_C_FLAGS_DEBUG
    CMAKE_C_FLAGS_RELEASE
     
    CMAKE_CXX_FLAGS
    CMAKE_CXX_FLAGS_DEBUG
    CMAKE_CXX_FLAGS_RELEASE
  • 相关阅读:
    真情感动看上海新闻娱乐频道“百家心”
    Treeview Navigation Web Part for SharePoint with SmartPart v1.0
    轻松玩转Typed DataSet, Part III
    微软Avalon和WinForms的发展蓝图
    Proxy Pattern using C#
    System.Threading.Timer类的TimerCallback 委托
    SmartPart v1.0 for SharePoint [Free Web Part]
    分布式应用架构中的数据传输对象(DTO)
    定制SharePoint Portal Server 2003站点的向导
    Bridge Pattern using C#
  • 原文地址:https://www.cnblogs.com/blogs-of-lxl/p/11402867.html
Copyright © 2011-2022 走看看