zoukankan      html  css  js  c++  java
  • CMake学习(1)---简单程序与库

    cmake是linux平台下重要的工具,可以方便的组织makefile。之前一直在windows平台下进行软件开发,在vs2010的IDE里,只要一点run程序就能跑出结果。但是程序的编译并没有那么简单。
    写一个程序大约可以分为以下几个部分

    1. coding,写代码,可以写在记事本里。
    2. 组织编译文件。说明各个代码文件之间的关系。
    3. make&link,根据组织好的编译文件和连接关系,将编译好的碎片组织成一个完整的可执行文件。

    cmake完成的工作就组织编译文件,说明代码对库的调用关系以便于代码对库进行链接。

    helloworld

    用cmake组织一个helloworld程序是开始cmake学习的基础。首先要有两个文件夹,一个存放源文件一个存放build之后得到的文件。
    文件夹组织为
    project
    ├── build
    └── src
    ├── CMakeLists.txt
    └── hello.cpp

    其中src中存放.cpp文件和CMakeLists.txt文件。这里尤其要注意一点

    1. 如果用了c++的库,那么必须写成.cpp,否则会无法识别c++的库函数如cout
    2. CMakeLists.txt一定不能拼错!!!!!头两个字母都是大写,最后有s,文件格式是.txt
    project(HELLO)
    set(SRC_LIST hello.cpp)
    add_executable(hello ${SRC_LIST})

    CMakeLists.txt文件
    可以看出CMakeLists.txt的编写方式还是处处表达它的unix基因,变量定义和取值的方式都和shellscript精神相呼应。

    1. 关键字set用来定义变量这里既可以用SRC_LIST也可用其他字母,但是最好好记。
    2. add_executable语句用来生成可执行文件
    3. CMakeLists.txt里的add表达的大多是生成的意思。${SRC_LIST}是取值的意思,和linux变量取值一样~~~

    #include <iostream>
    using namespace std;
    int main()
    {
        cout<<"hello world"<<endl;
        return 1;
    }

    hello.cpp文件


    这里的main函数似乎不能使用void定义,否则会提示main函数必须有返回值,应该是编译器的问题。

    分离式编程

    分离式编程指的是分开函数,头文件,main函数并把它放在不同的文件中的编程方式。好处是文件层次分明,方便管理和代码重用。
    文件结构如下
    project
    ├── build
    └── src
    ├── CMakeLists.txt
    ├── function.cpp
    ├── function.h
    ├── hello.cpp
    └── main.cpp


    其中CMakeLists.txt里的内容为

    project(HELLO)
    set(SRC_LIST main.cpp function.cpp)
    add_executable (hello ${SRC_LIST})

    可以看出,这里除了添加了main.cpp之外还添加了function.cpp,但是注意没有.h文件什么事。

    如果用qt 打开CMakeLists.txt的话,在文件组织里是会显示.h文件的。

    .h文件里包含了头文件iostream,并声明了打印函数,在function.cpp中完成了打印函数的定义。

    多文件夹分离式编译

    所实现的功能一多就很麻烦,需要很多代码。代码都混在一起是一件很纠结的事情,所以使用不同的文件夹存放代码。
    project5
    ├── build
    ├── CMakeLists.txt
    ├── lib
    │ ├── CMakeLists.txt
    │ ├── CMakeLists.txt~
    │ ├── function.cpp
    │ └── function.h
    └── src
    ├── CMakeLists.txt
    ├── CMakeLists.txt~
    └── main.cpp

    这里可以看出,在工程文件夹下有build文件夹,lib文件夹,src文件夹三种,每个文件夹下都要有CMakeLists.txt来说明文件夹之间的关系和文件夹内容。

    project文件夹下:总CMakeLists.txt

    project(HELLO)
    add_subdirectory(lib)
    add_subdirectory(src)

    这里有生成子目录lib和子目录src,这个子目录是在build文件夹下,不是工程文件夹下。

    lib文件夹下: 库CMakeLists.txt

    set(LIB_SRC function.cpp)
    add_library (libhello ${LIB_SRC})
    set(PROJECT_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
    1. 设置编译生成库的源文件
    2. 生成库
    3. 设置库的输出目录,其中PROJECT_BINARY_DIR,是指工程二进制文件目录,简而言之,build目录。

    在CMakeGUI中第二个选项是where to build the binaries,选了build。

    src文件夹下:源文件CMakeLists.txt

    include_directories(${PROJECT_SOURCE_DIR}/lib)
    #link_directories(${PROJECT_BINARY_DIR}/lib)
    set(APP_SRC main.cpp)
    set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
    add_executable (hello ${APP_SRC})
    target_link_libraries(hello libhello)
    1. 头文件所在位置。PROJECT_SOURCE_DIR是在CMakeGUI中选择的源文件所在位置。
    2. 库文件所在位置,原本库文件直接生成在build文件夹中,就不需要此句。但是现在修改了库文件输出位置,必须重新说明。
    3. 设置变量APP_SRC的内容
    4. 设置可执行文件输出位置
    5. 生成可执行文件hello,其变量是APP_SRC
    6. 设置可执行文件所要链接的库。

    下面是完整的源代码
    main.cpp

    #include "function.h"
    int main()
    {
    print();
    return 0;
    }

    function.cpp

    #include "function.h"
    using namespace std;
    int print()
    {
        cout<<"this is a cmakeprogram"<<endl;
        return 0;
    }

    function.h

    #include <iostream>
    int print();

    动态链接库

    把add_library(XXlib XXXX)addlibrary(XXlibSHARED{XXXX})

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    修改element ui默认样式
    MyUI是美亚柏科旗下新德汇出品的Web前端一站式项目工程框架。
    细谈 axios和ajax区别
    Window MySQL远程连接不上的解决
    为什么要前后端分离?各有什么优缺点?
    原生js
    node.js安装及环境配置之Windows篇
    IDEA 导入若依管理系统
     Java图形验证码,支持gif、中文、算术等类型,可用于Java Web、JavaSE等项目。
    获取git仓库时更新类型update type 的选择
  • 原文地址:https://www.cnblogs.com/ironstark/p/4892624.html
Copyright © 2011-2022 走看看