zoukankan      html  css  js  c++  java
  • (7)Cmake的使用简介

        CMake是一个跨平台的安装(编译)工具,是一个比Make更高级的的编译配置工具,可以根据不同平台、不同编译器,通过编写CmakeLists,可以控制生成的Makefile,从而控制编译过程。

        决定代码的组织方式及其编译方式,也是程序设计的一部分,类似autotools和cmake这样的项目构建工具就是帮助我们构建和维护代码的。

        (1)CMake的特点

    1.开放源码,实用类BSD许可发布;
    2.跨平台:
       在linux/unix平台,生成Makefile;
       在mac平台能够生成xcode;
       在windows平台能够生成msvc工程的配置文件,
    3.简化构建过程和编译过程,只需要cmake + make 就可以了;
    4.高效率;
    5.可扩展,可以为cmake编写特定功能的模块,扩充cmake的功能;

        (2)CMake的简单范例

        源码 main.c

    // main.c
    #include <stdio.h> int main(void) { printf("Hello World "); return 0; }

        配置文件 CMakeLists.txt

    #cmake最低版本需求,不加入此行会受到警告信息
    CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
    
    PROJECT(HELLO) #项目名称
    #把当前目录(.)下所有源代码文件和头文件加入变量SRC_LIST AUX_SOURCE_DIRECTORY(. SRC_LIST)
    #生成应用程序 hello (在windows下会自动生成hello.exe) ADD_EXECUTABLE(hello ${SRC_LIST})

        执行命令

    cmake .

        外部编译方式

        在上述例子中存在的问题是,cmake和make执行产生的中间文件与源文件main.c、配置文件CMakeLists.txt混在一起;外部编译方式将在test目录下新建build文件夹,在进入build文件夹后采用 cmake .. 命令 将所有中间文件及目标文件生成在build文件夹,当需要删除时可以直接删除该目录。

        (3)CMakeList参数详解

    1)PROJECT
    语法:PROJECT(projectname [CXX] [C] [JAVA])
    功能:定义工程的名称和定义工程支持的语言,这个命令也隐式指定了两个cmake变量:
    <projectname>_BINARY_DIR   目标文件目录
    <projectname>_SOURCE_DIR  源文件目录
    (2)SET
    语法:SET ( VAR[VALUE] [CACHE TYPE DOCSTRING [FORCE]] )
    功能:用来显示地定义变量。如果有多个源文件1.c 2.c 3.c 可以这样设置
    SET(SRC_LIST 1.c 2.c 3.c)
    SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) 设置保存可执行文件到工程编译路径下的bin子目录
    SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) 设置库文件保存到工程编译路径下的lib子目录 (
    3)MESSAGE 语法:MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" ...) 功能:这个指令向终端输出用户信息,包含三种类型: SEND_ERROR:生成错误信息 STATUS:输出状态信息,带-- FATAL_ERROR:立即终止所有cmake进程 (4)ADD_EXECUTABLE 用法:ADD_EXECUTABLE(DEST SRC_LIST) 功能:根据源文件SRC_LIST生成可执行文件DEST (5)ADD_SUBDIRECTORY

    用法:ADD_SUBDIRECTORY(SUBDIR DESTDIR)
    功能:添加当前子目录SUBDIR,并将子目录SUBDIR中CMakeLists.txt中待生成的目标文件生成到编译目录的子目录DESTDIR下
    SUBDIRS(SUBDIR1 SUBDIR2)此指令可以一次添加多个子目录,但生成的中间文件和目标文件都将在编译目录下重复一份
    (6)CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
    指定版本,放在工程根目录CMakeLists.txt的开始
    (7)ADD_LIBRARY(DEST type FILE_LIST)
    DEST 库名
    TYPE:静态库还是动态库 static or shared
    FILE_LIST:源码列表
    (8)SET_TARGET_PROPERTIES
    SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")将hello_static静态库的显示名称改为helo
    (9)GET_TARGET_PROPERTY
    GET_TARGET_PROPERTY(var hello_static OUTPUT_NAME)获取hello_static库的OUTPUT_NAME属性设置到变量var上
    (10)INCLUDE_DIRECTORIES
    用法:INCLUDE_DIRECTORIES(DIR)
    功能:将目录DIR包含进头文件搜索路径
    (11)LINK_DIRECTORIES
    用法:LINK_DIRECTORIES(DIR)
    功能:指定要链接的库所在的搜索路径
    (12)TARGET_LINK_LIBRARIES
    TARGET_LINK_LIBRARIES(DESTLIB YLLIB)
    DESTLIB:待编译成的目标库
    YLLIB:依赖的库名
    (13)INSTALL
    用法:安装库文件、可执行文件、脚本文件等到目标路径,还可以CMAKE脚本或者CMAKE命令
    INSTALL(TARGETS target
    RUNTIME DESTINATION bin #可执行文件安装路径
    LIBRARY DESTINATION lib #动态库安装路径
    ARCHIVE DESTINATION libstatic) #静态库安装路径
    INSTALL(FILES files
    DESTINATION DIR
    PERMISSIONS permissions) #赋予权限 OWNER_WRITER,OWER_READ,GROUP_READ,WORLD_READ #664权限
    INSTALL(PROGRAMS files
    DESTINATION DIR
    PERMISSIONS permissions) #赋予权限 OWNER_EXECUTE,GROUP_EXECUTE,WORLD_EXECUTE #775权限
    INSTALL(SCRIPT ......) 执行脚本
    INSTALL(CODE ......) 执行命令

        (4)CMake综合范例

        文件目录树如下:

      

        本范例将实现下列目标:

    1.利用cmake_test/src/util目录下的static_print.c和cmake_test/include下的static_print.h生成静态库libutil.a,动态库libutil.so;
    2.将libutil.a、libutil.so生成到cmake_test/lib目录下;
    3.利用cmake_test/src/main目录下的main.cpp和libutil.a库和cmake_test/include下的头文件static_print.h头文件生成可执行文件hello;
    4.将可执行文件hello生成到cmake_test/bin目录下
    5.将cmake_test目录下的README文件安装到/backup/doc下,将cmake_test工程下runhello.sh脚本安装/backup/bin
    6.将cmake_test目录下的lib/libutil.a libutil.so安装到/backup/lib目录下

        1)cmake_test/CMakeLists.txt

    CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
    PROJECT(HELLO)
    ADD_SUBDIRECTORY(src)
    INSTALL(PROGRAMS runhello.sh
            DESTINATION bin
            PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ
            )
    INSTALL(FILES README DESTINATION doc

        2) cmake_test/include/static_print.h

    #ifndef _STATIC_PRINT_H_
    #define _STATIC_PRINT_H_
    
    namespace cmake_test
    {
    class CMakeTest
    {
      public:
              void cmake_print();
    };
    }
    #endif

        3)cmake_test/src/CMakeLists.txt

    ADD_SUBDIRECTORY(util)
    ADD_SUBDIRECTORY(main)

        4) cmake_test/src/util/CMakeLists.txt

    SET(LIBRARY_OUTPUT_PATH ${HELLO_SOURCE_DIR}/lib)
    SET(CMAKE_C_COMPILER g++)
    SET(SRC_LIST static_print.c)
    
    INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include)
    ADD_LIBRARY(util STATIC ${SRC_LIST})
    ADD_LIBRARY(util_shared SHARED ${SRC_LIST})
    SET_TARGET_PROPERTIES(util_shared PROPERTIES OUTPUT_NAME "util")
    INSTALL(TARGETS util util_shared
            ARCHIVE DESTINATION lib
            LIBRARY DESTINATION lib

        5)cmake_test/src/util/static_print.c

    #include<stdio.h>
    #include "static_print.h"
    
    namespace cmake_test
    {
      void CMakeTest::cmake_print()
      {
        printf("cmake static library print!");
      }
    }

        6)cmake_test/src/main/CMakeLists.txt

    SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
    SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
    SET(SRC_LIST main.cpp)
    INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include)
    LINK_DIRECTORIES(${HELLO_SOURCE_DIR}/lib)
    
    ADD_EXECUTABLE(hello ${SRC_LIST})
    TARGET_LINK_LIBRARIES(hello util)

        7)cmake_test/src/main/main.cpp

    #include<iostream>
    #include "static_print.h"
    using namespace std;
    
    int main()
    {
      //1.使用被链接的静态库
      cmake_test::CMakeTest test;
      test.cmake_print();
      //2.当前程序
      printf("this is current main.cpp!");
      return 0;
    }

        8)cmake_test/runhello.sh

    hello

        9)在cmake_test下

    touch README

        10)创建如下目录

    mkdir /backup/lib
    mkdir /backup/bin
    mkdir /backup/doc
    

       11)在cmake_test目录下创建build目录,并在cmake_test/build执行如下命令

    cmake -DCMAKE_INSTALL_PREFIX=/backup ..
    make install

         执行过程与结果如下:

     

  • 相关阅读:
    下载某页面下的所有图片
    ruby程序处理HTML编辑器内容只保留类似UBB的内容
    用ruby获取Email邮箱标题并判断
    Win7 Ruby on rails 开发环境安装
    [SQL2005触发器学习]5、触发器的使用技巧
    使用jquery获取checkbox组和radio组的值
    一个小bug 看浏览器内核加载页面的方式
    我们是一群和平年代充满浮躁与抱怨的程序员
    COM+异常:系统找不到指定的文件。 (异常来自 HRESULT:0x80070002)
    以过桥算法来谈如何满足客户的需求和程序设计步骤
  • 原文地址:https://www.cnblogs.com/MenAngel/p/11609542.html
Copyright © 2011-2022 走看看