前面一節說了cmake簡易使用,但是實際開發中項目文件非常多,使用哪種簡易方式會導致代碼十分混亂,因此本文介紹一種cmake管理大型項目的demo流程。
具體步驟如下:
1.創建相關的項目目錄
cmd
mkdir hello
cd hello
mkdir inlude lib src debug
其中inlucde用來存放頭文件,lib用來存放庫文件,src用來存放源程序,debug用來作調試,類似於qt等IDE環境的配置cd src
mkdir main util
其中main用來存放主程序(這裏以main.cpp爲例),util用來存放相關的庫源程序(這裏以hello.cpp爲例)2.創建相關的源文件
在include中添加項目相關的頭文件(這裏以hello.h爲例):
hello.h
#ifndef _HELLO_H_
#define _HELLO_H_
extern int hello();
#endif
在main中添加主程序main.cpp如下:#include <iostream>
#include "hello.h"
int main(){
hello();
return 0;
}
在util中添加hello.cpp如下:#include <iostream>
using namespace std;
int hello(){
cout << "hello word cmake!!!" << endl;
return 0;
}
3.創建相關的配置文件CMakeLists.txt:在頂級目錄hello中添加CMakeLists.txt如下:
<pre name="code" class="cpp">PROJECT(HELLO)#設置工程名
ADD_SUBDIRECTORY(src)
CMAKE_MINIMUM_REQUIRED(VERSION 3.7)#設置版本號
MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir " ${HELLO_SOURCE_DIR})
這裏定義了子目錄src,用以遞歸的調用src中的CMakeLists.txt
src目錄中添加CMakeLists.txt如下:
ADD_SUBDIRECTORY(util)
ADD_SUBDIRECTORY(main)
這裏設置再次遞歸調用main與util中的CMakeLists.txt
main目錄中添加CMakeLists.txt如下:SET(EXECUTABLE_OUTPUT_PATH ${HELLO_SOURCE_DIR}/bin)
SET(SRC_LIST main.cpp)
INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include)
LINK_DIRECTORIES(${HELLO_SOURCE_DIR}/lib)
ADD_EXECUTABLE(hello ${SRC_LIST})
TARGET_LINK_LIBRARIES(hello util)
這裏的主要是是用來定義可執行程序編譯和鏈接時所需要的一些命令或環境。INCLUDE_DIRECTORIES命令是定義工程的include文件夾,其中存放使用到的庫的頭文件,LINK_DIRECTORIES是
定義工程的庫文件,其中存放着庫文件,ADD_EXECUTABLE是定義生成的可執行文件,TARGET_LINK_LIBRARIES用
以定義鏈接時需要的庫文件。
util目錄中添加CMakeLists.txt如下:
SET(LIBRARY_OUTPUT_PATH ${HELLO_SOURCE_DIR}/lib)
SET(CMAKE_C_COMPILER g++)
SET(SRC_LIST hello.cpp)
INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include)
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
..\bin\hello.exe
5.安裝
在工程目錄下添加COPYRIGHT、README、和run.bat,創建doc文件夾,在doc中新建hellot.txt
在頂級工程目錄hello的CMakeLists.txt中添加如下命令:
INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake_demo)
INSTALL(PROGRAMS run.bat DESTINATION bin)
INSTALL(PROGRAMS bin/hello.exe DESTINATION bin)
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#查看安裝目錄