• ubuntu16.04下Cmake学习一


    根据网上的资料,我总结了一下,一个工程应该有根目录(bin)存放可执行文件,头文件目录(include)存放头文件,源码文件(src)存放你的算法,还需要一个库文件夹存放你编译的静态库或者动态库。然后得出下面这个例子:

    工程文件目录创建

    /home/bmi-zc/project:
    |—CMakeLists.txt 顶层CMakeLists
    |
    |—bin
    |
    |—include
    |    test.h    
    |
    |—lib
    |
    |—src
      |  CMakeLists.txt
      |  
      |—main
      |  CMakeLists.txt
      |  main.c
      |
      |—test
        CMakeLists.txt
        test1.c
        test2.c  

    程序清单

    test.h

        #ifndef INCLUDE_TEST_H
        #define INCLUDE_TEST_H
        void t1();
        void t2();
        #endif /*INCLUDE_TEST_H*/
    

    test1.c

        #include "/home/bmi-zc/project/include/test.h"
        #include <stdio.h>
        void t1()
        {
        printf("this is t1()
    ");	
        }
    

    test2.c

        #include "/home/bmi-zc/project/include/test.h"
        #include <stdio.h>
        void t2()
        {
        printf("this is t2()
    ");
        }
    

    main.c:

        #include "/home/bmi-zc/project/include/test.h"  
        int main()  
        {  
        t1();  
        t2();  
        return 0;  
        }
    

    多目录多文件CMakeLists.txt

    1 . 顶层CMakeLists.txt

    /home/bmi-zc/project/CMakeLists.txt:

        cmake_minimum_required(VERSION 3.5)
        PROJECT(TEST)
        ADD_SUBDIRECTORY(src)
    

    CMakeLists.txt内容:指定项目名称,添加工程源码子目录(子目录里面还有目录,只需要把源码根目录添加进去就行,例如上图,只需要添加src目录ADD_SUBDIRECTORY(src)即可)。
    用到的指令:PROJECT,ADD_SUBDIRECTORY。

    • 指定CMake的最低版本
      cmake_minimum_required(VERSION 3.5)
      不添加这一句并不影响整个cmake的过程,但是cmake会建议你加上这一句。
    • project命令
      project(项目名称)
      例子:PROJECT(TEST)
      系统预定义变量PROJECT_SOURCE_DIR和PROJECT_BINARY_DIR。
      PROJECT_SOURCE就是项目的根目录,例如;头文件include目录路径可以表示为:
      ${PROJECT_SOURCE_DIR}/include ,其中PROJECT是可以换为项目名称TEST的。建议使用PROJECT_SOURCE_DIR。
      若使用“项目名称“_SOURCE_DIR,一旦项目名称更改,所有对应的名称也要更改。
    • ADD_SUBDIRECTORY命令
      ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
      例子:ADD_SUBDIRECTORY(src bin)
      这个指令用于向当前工程添加存放源文件目录下的子目录(源码存放在src目录,需要自己提前创建src,并把源码放进去),并可以指定中间二进制和目标二进制存放的位置(bin目录,系统自己会创建)。
      EXCLUDE_FROM_ALL 参数的含义是将这个目录从编译过程中排除。比如,工程的 example,可能就需要工程构建完成后,再进入 example 目录单独进行构建。

    2. 源码目录下顶层CMakeLists.txt

    /home/bmi-zc/project/src/

        ADD_SUBDIRECTORY(main)
        ADD_SUBDIRECTORY(test)
    

    CMakeLists.txt内容:添加源码子目录
    所用到指令:ADD_SUBDIRECTORY

    3. 源码子目录(算法目录)CMakeLists.txt

    /home/bmi-zc/project/src/test/

        SET(CMAKE_C_COMPTLER GCC)
        SET(SRC_LIST test1.c test2.c)
        INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)
        SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
        ADD_LIBRARY(libtest STATIC ${SRC_LIST})
    

    CMakeLists.txt内容:设置编辑器,添加头文件路径,设置lib输出目录,生成静态链接库

    • SET命令
      SET(CMAKE_INSTALL_PREFIX /usr/local)
      指令含义(类似宏定义):路径/usr/local用CMAKE_INSTALL_PREFIX来代替
      SET(VAR[VALUE][CACHE TYPE DOCSTRING[FORCE]])指令,将所有文件组合成一股列表清单,例如:SET(SRC_LIST main.c test.c p.c)。
      SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)把静态链接库的结果生成到/home/bmi-zc/peoject/lib中
    • INCLUDE_DIRECTORIES
      例子:INCLUDE_DIRECTORIES( ../include)
      INCLUDE_DIRECTORIES类似gcc中的编译参数“-I”,指定编译过程中编译器搜索头文件的路径。当项目需要的头文件不在系统默认的搜索路径时,需要指定该路径。在我们的项目中,test1,test2所需的头文件都存放在${TEST_SOURCE_DIR}/include下。
    • ADD_LIBRARY
      ADD_LIBRARY(libname [SHARED | STATIC | MODULE] [EXCLUDE_FROM_ALL] SRC_LIST)
      生成静态链接库或动态库
      例子:ADD_LIBRARY(libtest STATIC ${SRC_LIST})

    /home/bmi-zc/project/src/main

        SET(SRC_LIST main.c)
        INCLUDE_DIRECTORIES(${TEST_SOURCE_DIR}/include)
        SET(EXECUTABLE_OUTPUT_PATH ${TEST_SOURCE_DIR}/bin)
        ADD_EXECUTABLE(main ${SRC_LIST})
        link_directories(${TEST_SOURCE_DIR}/lib)
        TARGET_LINK_LIBRARIES(main libtest)
    

    CMakeLists.txt内容:整理代码清单,头文件目录,可执行文件输出路径,静态库链接路径,链接静态库。

    • ADD_EXECUTABLE
      生成可执行文件,ADD_EXECUTABLE(main ${SRC_LIST}),执行文件名字叫main。SRC_LIST为编译清单。
    • link_directories
      添加静态链接库路径,${TEST_SOURCE_DIR}/lib为路径等同于/home/bmi-zc/project/lib。
    • TARGET_LINK_LIBRARIES
      将静态库添加到可执行文件中,
      TARGET_LINK_LIBRARIES(main libtest),main为可执行文件,libtest为静态库的名字,注意要和之前创建的静态库名字一样。

    编译

    • 回到工程根目录,/home/bmi-zc/project
      cmake .
      make

    • 进入bin文件夹,执行main可执行文件
      cd bin
      ./main

    分享推送

  • 相关阅读:
    Spring Bean(一)
    Spring IOC(一)
    三种常用的查找算法
    分布式架构的一致性
    Java内存区域笔记(一)
    分组交换和电路交换
    Python说文解字_Python之多任务_03
    Python说文解字_Python之多任务_02
    Python说文解字_Python之多任务_01
    Python说文解字_杂谈09
  • 原文地址:https://www.cnblogs.com/xsfmg/p/5902549.html
Copyright © 2020-2023  润新知