zoukankan      html  css  js  c++  java
  • windows下使用cmake+mingw配置makefile

    前面一节说了cmake简易使用,但是实际开发中项目文件非常多,使用哪种简易方式会导致代码十分混乱,因此本文介绍一种cmake管理大型项目的demo流程。

    具体步骤如下:

    1.创建相关的项目目录

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. cmd   
    2. mkdir hello  
    3. cd hello  
    4. mkdir inlude lib src debug  

    其中inlucde用来存放头文件,lib用来存放库文件,src用来存放源程序,debug用来作调试,类似于qt等IDE环境的配置

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. cd src  
    2. mkdir  main  util   

    其中main用来存放主程序(这里以main.cpp为例),util用来存放相关的库源程序(这里以hello.cpp为例)
    2.创建相关的源文件 
    在include中添加项目相关的头文件(这里以hello.h为例):

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. hello.h  
    2. #ifndef _HELLO_H_  
    3. #define _HELLO_H_  
    4. extern int hello();  
    5.   
    6. #endif  

    在main中添加主程序main.cpp如下:

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. #include <iostream>  
    2. #include "hello.h"  
    3.   
    4.   
    5. int main(){  
    6.     hello();  
    7.       
    8.     return 0;  
    9. }  

    在util中添加hello.cpp如下:

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. #include <iostream>  
    2. using namespace std;  
    3.   
    4.   
    5. int hello(){  
    6.     cout << "hello word cmake!!!" <<  endl;  
    7.       
    8.     return 0;  
    9. }  

    3.创建相关的配置文件CMakeLists.txt:
    在顶级目录hello中添加CMakeLists.txt如下:

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. <pre name="code" class="cpp">PROJECT(HELLO)#设置工程名  
    2. ADD_SUBDIRECTORY(src)  
    3. CMAKE_MINIMUM_REQUIRED(VERSION 3.7)#设置版本号  
    4.   
    5. MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})  
    6. MESSAGE(STATUS "This is SOURCE dir " ${HELLO_SOURCE_DIR})  
    
    

    这里定义了子目录src,用以递归的调用src中的CMakeLists.txt

    src目录中添加CMakeLists.txt如下:

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. ADD_SUBDIRECTORY(util)  
    2. ADD_SUBDIRECTORY(main)  
    3. 这里设置再次递归调用main与util中的CMakeLists.txt  

    main目录中添加CMakeLists.txt如下:

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. SET(EXECUTABLE_OUTPUT_PATH ${HELLO_SOURCE_DIR}/bin)  
    2. SET(SRC_LIST main.cpp)  
    3.   
    4. INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include)  
    5. LINK_DIRECTORIES(${HELLO_SOURCE_DIR}/lib)  
    6.   
    7. ADD_EXECUTABLE(hello ${SRC_LIST})  
    8. TARGET_LINK_LIBRARIES(hello util)  

      这里的主要是是用来定义可执行程序编译和链接时所需要的一些命令或环境。
    INCLUDE_DIRECTORIES命令是定义工程的include文件夹,其中存放使用到的库的头文件,LINK_DIRECTORIES是
    定义工程的库文件,其中存放着库文件,ADD_EXECUTABLE是定义生成的可执行文件,TARGET_LINK_LIBRARIES用
    以定义链接时需要的库文件。

    util目录中添加CMakeLists.txt如下:

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. SET(LIBRARY_OUTPUT_PATH ${HELLO_SOURCE_DIR}/lib)  
    2. SET(CMAKE_C_COMPILER g++)  
    3. SET(SRC_LIST hello.cpp)  
    4. INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include)  
    5. ADD_LIBRARY(util STATIC ${SRC_LIST})  

    其中SET(LIBRARY_OUTPUT_PATH ${HELLO_SOURCE_DIR}/lib)定义了库生成的路径,LIBRARY_OUTPUT_PATH是一个内部变量,
    存放库生成路径。SET(SRC_LIST hello.c)是用来定义库文件需要的源文件。ADD_LIBRARY(util STATIC ${SRC_LIST})是
    用来定义生成的库的名字,以及生成库的类型和生成库需要的源文件。SET(CMAKE_C_COMPILER g++)是用来定义c的编译器
    为g++,防止出现C和C++代码在不指定C编译器的情况下默认使用gcc,导致系统编译混乱
    配置完成后目录结构如下:


    4.编译运行
    cd debug
    cmake -G "MinGW Makefiles" ..


    make 

    ..inhello.exe


    5.安装

    在工程目录下添加COPYRIGHT、README、和run.bat,创建doc文件夹,在doc中新建hellot.txt

    在顶级工程目录hello的CMakeLists.txt中添加如下命令:

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake_demo)  
    2. INSTALL(PROGRAMS run.bat DESTINATION  bin)  
    3. INSTALL(PROGRAMS bin/hello.exe DESTINATION  bin)  
    4. INSTALL(DIRECTORY doc/  DESTINATION share/doc/cmake_demo   

    这些命令表示在执行make install命令时,安装程序会拷贝相应的文件、目录或程序到指定的前缀开始的目录中

    重新构建cmake

    cmake -G "MinGW Makefiles"  -DCMAKE_INSTALL_PREFIX=c:cmakedemo  ..#指定前缀c:cmakedemo构建
    make install#安装工程


    tree /F c:cmakedemo#查看安装目录

    http://blog.csdn.net/xiaopangzi313/article/details/53117923

    http://blog.csdn.net/xiaopangzi313/article/details/53115702

  • 相关阅读:
    npm install遇到的问题
    已经安装了node和npm,输入node -v 未找到命令
    虚拟机VMware搭建代码环境
    使用VMware出现的各种问题
    bind、delegate、on的区别
    软件设计原则
    Qt 模型/视图/委托
    UML类图与类间六种关系表示
    C++内存分配与释放
    SQLite 自定义函数,聚合,排序规则
  • 原文地址:https://www.cnblogs.com/findumars/p/6375965.html
Copyright © 2011-2022 走看看