標籤:

windows下使用cmake+mingw配置makefile(二)

原創 2016年11月10日 17:43:59

  • 前面一節說了cmake簡易使用,但是實際開發中項目文件非常多,使用哪種簡易方式會導致代碼十分混亂,因此本文介紹一種cmake管理大型項目的demo流程。

    具體步驟如下:

    1.創建相關的項目目錄

    [cpp] view plain copy print?

    1. cmd
    2. mkdirhello
    3. cdhello
    4. mkdirinludelibsrcdebug

    其中inlucde用來存放頭文件,lib用來存放庫文件,src用來存放源程序,debug用來作調試,類似於qt等IDE環境的配置[cpp] view plain copy print?

    1. cdsrc
    2. mkdirmainutil

    其中main用來存放主程序(這裡以main.cpp為例),util用來存放相關的庫源程序(這裡以hello.cpp為例)2.創建相關的源文件在include中添加項目相關的頭文件(這裡以hello.h為例):[cpp] view plain copy print?

    1. hello.h
    2. #ifndef_HELLO_H_
    3. #define_HELLO_H_
    4. externinthello();
    5. #endif

    在main中添加主程序main.cpp如下:[cpp] view plain copy print?

    1. #include<iostream>
    2. #include"hello.h"
    3. intmain(){
    4. hello();
    5. return0;
    6. }

    在util中添加hello.cpp如下:[cpp] view plain copy print?

    1. #include<iostream>
    2. usingnamespacestd;
    3. inthello(){
    4. cout<<"hellowordcmake!!!"<<endl;
    5. return0;
    6. }

    3.創建相關的配置文件CMakeLists.txt:在頂級目錄hello中添加CMakeLists.txt如下:[cpp] view plain copy print?

    1. <prename="code"class="cpp">PROJECT(HELLO)#設置工程名
    2. ADD_SUBDIRECTORY(src)
    3. CMAKE_MINIMUM_REQUIRED(VERSION3.7)#設置版本號
    4. MESSAGE(STATUS"ThisisBINARYdir"${HELLO_BINARY_DIR})
    5. MESSAGE(STATUS"ThisisSOURCEdir"${HELLO_SOURCE_DIR})

    這裡定義了子目錄src,用以遞歸的調用src中的CMakeLists.txt

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

    [cpp] view plain copy print?

    1. ADD_SUBDIRECTORY(util)
    2. ADD_SUBDIRECTORY(main)
    3. 這裡設置再次遞歸調用main與util中的CMakeLists.txt

    main目錄中添加CMakeLists.txt如下:[cpp] view plain copy print?

    1. SET(EXECUTABLE_OUTPUT_PATH${HELLO_SOURCE_DIR}/bin)
    2. SET(SRC_LISTmain.cpp)
    3. INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include)
    4. LINK_DIRECTORIES(${HELLO_SOURCE_DIR}/lib)
    5. ADD_EXECUTABLE(hello${SRC_LIST})
    6. TARGET_LINK_LIBRARIES(helloutil)

    這裡的主要是是用來定義可執行程序編譯和鏈接時所需要的一些命令或環境。INCLUDE_DIRECTORIES命令是定義工程的include文件夾,其中存放使用到的庫的頭文件,LINK_DIRECTORIES是定義工程的庫文件,其中存放著庫文件,ADD_EXECUTABLE是定義生成的可執行文件,TARGET_LINK_LIBRARIES用以定義鏈接時需要的庫文件。util目錄中添加CMakeLists.txt如下:[cpp] view plain copy print?

    1. SET(LIBRARY_OUTPUT_PATH${HELLO_SOURCE_DIR}/lib)
    2. SET(CMAKE_C_COMPILERg++)
    3. SET(SRC_LISThello.cpp)
    4. INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include)
    5. ADD_LIBRARY(utilSTATIC${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 debugcmake -G "MinGW Makefiles" ..

    make

    ..inhello.exe

    5.安裝

    在工程目錄下添加COPYRIGHT、README、和run.bat,創建doc文件夾,在doc中新建hellot.txt

    在頂級工程目錄hello的CMakeLists.txt中添加如下命令:

    [cpp] view plain copy print?

    1. INSTALL(FILESCOPYRIGHTREADMEDESTINATIONshare/doc/cmake_demo)
    2. INSTALL(PROGRAMSrun.batDESTINATIONbin)
    3. INSTALL(PROGRAMSbin/hello.exeDESTINATIONbin)
    4. INSTALL(DIRECTORYdoc/DESTINATIONshare/doc/cmake_demo

    這些命令表示在執行make install命令時,安裝程序會拷貝相應的文件、目錄或程序到指定的前綴開始的目錄中

    重新構建cmake

    cmake -G "MinGW Makefiles" -DCMAKE_INSTALL_PREFIX=c:cmakedemo ..#指定前綴c:cmakedemo構建make install#安裝工程

    tree /F c:cmakedemo#查看安裝目錄


    推薦閱讀:

    I can make my own money!
    为什么make up for ever 翻译成浮生若梦?
    無需手寫任何代碼,直接快速編譯源代碼
    Chinese university bans students from celebrating Christmas because its kitsch and makes them wat

    TAG:配置 | file | make |