美文网首页
CMake Hello World

CMake Hello World

作者: 8993c20c49db | 来源:发表于2018-04-22 10:54 被阅读0次

    cmake是什么、为什么使用cmake

    在Linux环境编写C、C++时,常用make工具编译和链接工程,在单一的Linux环境下,make已经可以很好的发挥作用时;但在复杂的开发环境、运行环境下,make就有点捉襟见肘,make对环境的依赖很强,在不同环境下不同的编译器等,make工具makefile文件都需要根据实际情况进行修改,这意味着如果一个工程需要部署在复杂的环境下,对makefile的适配也将是一项复杂的工程;在此背景之下,CMake应运而生,CMake是一个比make更高级的编译配置工具,它可以根据不同平台、不同的编译器,生成相应的Makefile,达到一个编写,多环境编译的效果。

    从单文件开始

    main.cpp

    #include <iostream>
    
    int main() {
        std::cout << "Hello World!" << std::endl;
        return 0;
    }
    

    CMakeLists.txt

    cmake_minimum_required(VERSION 3.8) # cmake最低版本要求
    
    project(CmakeHelloWorld) # 项目名字
    
    set(CMAKE_CXX_STANDARD 11) # cpp标准
    
    set(SOURCE_FILES main.cpp) # sources文件
    
    add_executable(main ${SOURCE_FILES}) # 可执行文件,将所有sources文件编译成可执行文件main
    

    执行结果:

    Hello World!
    

    编译多文件

    创建include/lib/lib.h

    #ifndef CMAKEHELLOWORLD_LIB_H
    #define CMAKEHELLOWORLD_LIB_H
    
    namespace cmakelib{
        void say_hello();
    }
    
    #endif //CMAKEHELLOWORLD_LIB_H
    

    创建src/lib/lib.cpp

    #include <iostream>
    
    #include "../../include/lib/lib.h"
    
    namespace cmakelib{
    
        void say_hello(){
            std::cout << "In lib.cpp!" << std::endl;
            std::cout << "Hello World!" << std::endl;
        }
    }
    

    修改main.cpp

    #include "include/lib/lib.h"
    
    int main() {
        cmakelib::say_hello();
        return 0;
    }
    

    目录结构

    - include/
       -lib/lib.h
    - src/
       - lib/lib.cpp
    - CMakeLists.txt
    - main.cpp
    

    CMakeLists.txt

    cmake_minimum_required(VERSION 3.8)
    
    project(CmakeHelloWorld)
    
    set(CMAKE_CXX_STANDARD 11)
    
    ##############--origin--##############
    ## set(SOURCE_FILES main.cpp)
    ######################################
    set(SOURCE_FILES main.cpp src/lib/lib.cpp include/lib/lib.h) # 增加了lib.cpp 和 lib.h 作为sources文件
    
    add_executable(main ${SOURCE_FILES})
    

    执行结果

    In lib.cpp!
    Hello World!
    

    配置头文件路径

    lib/lib.cpp包含头文件使用相对路径不太优雅。修改CMakeLists.txt增加include路径,让其优雅一些。

    cmake_minimum_required(VERSION 3.8)
    
    project(CmakeHelloWorld)
    
    set(CMAKE_CXX_STANDARD 11)
    
    ## 增加这一行
    include_directories(include) # 将include路径设为头文件目录
    
    set(SOURCE_FILES main.cpp src/lib/lib.cpp include/lib/lib.h)
    
    add_executable(main ${SOURCE_FILES})
    

    之后可以修改lib.cpp和main.cpp里面包含lib.h的代码

    // main.cpp
    // #include "include/lib/lib.h" =>
    #include "lib/lib.h"
    
    // lib.cpp
    // #include "../../include/lib/lib.h" =>
    #include "lib/lib.h"
    

    配置sources文件路径

    当cpp文件太多时,set(SOURCE_FILES ...)命令就会变得冗长,通过配置sources文件路径解决这个问题。

    cmake_minimum_required(VERSION 3.8)
    
    project(CmakeHelloWorld)
    
    set(CMAKE_CXX_STANDARD 11)
    
    include_directories(include)
    
    ##############--origin--##############
    ## set(SOURCE_FILES main.cpp src/lib/lib.cpp include/lib/lib.h)
    ## add_executable(main ${SOURCE_FILES})
    ######################################
    
    aux_source_directory(src/lib DIR_SRCS) # aux_source_directory命令增加sources文件路径,不支持递归
    
    add_executable(main main.cpp ${DIR_SRCS})
    

    执行结果

    In lib.cpp!
    Hello World!
    

    生成链接库

    修改一下lib.cpp,表明实在链接库里面执行的

    #include <iostream>
    
    #include "lib/lib.h"
    
    namespace cmakelib{
    
        void say_hello(){
            std::cout << "In libcmakelib.a!" << std::endl;
            std::cout << "Hello World!" << std::endl;
        }
    }
    
    

    将lib.cpp编译成链接库。

    cmake_minimum_required(VERSION 3.6)
    
    project(CmakeHelloWorld)
    
    set(CMAKE_CXX_STANDARD 11)
    
    include_directories(include)
    
    aux_source_directory(src/lib DIR_SRCS)
    
    ##############--origin--##############
    ## add_executable(main main.cpp ${DIR_SRCS})
    ######################################
    
    add_library(cmakelib SHARED ${DIR_SRCS}) # 动态链接库 => libcmakelib.so
    ## add_libraay(cmakelib STATIC ${DIR_SRCS}) # 静态链接库 => libcmakelib.a
    

    使用链接库

    上面把lib.cpp编成库了,下面看看如何使用这个库。

    创建ldlib目录,把libcmakelib.a放到里面去,项目路径如下:

    - include/
       -lib/lib.h
    - src/
       - lib/lib.cpp
    - ldlib/
       - libcmakelib.a
    - CMakeLists.txt
    - main.cpp
    

    修改CMakeLists.txt

    cmake_minimum_required(VERSION 3.6)
    
    project(CmakeHelloWorld)
    
    set(CMAKE_CXX_STANDARD 11)
    
    include_directories(./include)
    
    aux_source_directory(./src/lib DIR_SRCS)
    
    ##############--origin--##############
    ## add_library(cmakelib STATIC ${DIR_SRCS})
    ## add_executable(main main.cpp ${DIR_SRCS})
    ######################################
    
    link_directories(./ldlib) # 指定链接库路径
    
    add_executable(main main.cpp) # 把lib变成了库,不在需要lib.cpp作为sources文件
    
    target_link_libraries(main libcmakelib.a) # 指定链接的库名
    

    输出结果

    In libcmakelib.a!
    Hello World!
    

    相关文章

      网友评论

          本文标题:CMake Hello World

          本文链接:https://www.haomeiwen.com/subject/gmprfftx.html