转载自:https://blog.csdn.net/xiaopangzi313/article/details/53117923
前面一节说了cmake简易使用,但是实际开发中项目文件非常多,使用哪种简易方式会导致代码十分混乱,因此本文介绍一种cmake管理大型项目的demo流程。
具体步骤如下:
1.创建相关的项目目录
- cmd
- mkdir hello
- cd hello
- mkdir inlude lib src debug
cmd
mkdir hello
cd hello
mkdir inlude lib src debug
其中inlucde用来存放头文件,lib用来存放库文件,src用来存放源程序,debug用来作调试,类似于qt等IDE环境的配置
- cd src
- mkdir main util
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
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;
- }
#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;
- }
#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}) </span></span></li><li class=""><span>MESSAGE(STATUS <span class="string">"This is SOURCE dir "</span><span> {HELLO_BINARY_DIR}) </span></span></li><li class=""><span>MESSAGE(STATUS <span class="string">"This is SOURCE dir "</span><span> {HELLO_SOURCE_DIR})
<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
ADD_SUBDIRECTORY(util)
ADD_SUBDIRECTORY(main)
这里设置再次递归调用main与util中的CMakeLists.txt
main目录中添加CMakeLists.txt如下:
- SET(EXECUTABLE_OUTPUT_PATH {HELLO_SOURCE_DIR}/bin) </span></span></li><li class=""><span>SET(SRC_LIST main.cpp) </span></li><li class="alt"><span> </span></li><li class=""><span>INCLUDE_DIRECTORIES( {HELLO_SOURCE_DIR}/bin) </span></span></li><li class=""><span>SET(SRC_LIST main.cpp) </span></li><li class="alt"><span> </span></li><li class=""><span>INCLUDE_DIRECTORIES( {HELLO_SOURCE_DIR}/include)
- LINK_DIRECTORIES({HELLO_SOURCE_DIR}/lib) </span></li><li class=""><span> </span></li><li class="alt"><span>ADD_EXECUTABLE(hello {HELLO_SOURCE_DIR}/lib) </span></li><li class=""><span> </span></li><li class="alt"><span>ADD_EXECUTABLE(hello {SRC_LIST})
- TARGET_LINK_LIBRARIES(hello util)
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) </span></span></li><li class=""><span>SET(CMAKE_C_COMPILER g++) </span></li><li class="alt"><span>SET(SRC_LIST hello.cpp) </span></li><li class=""><span>INCLUDE_DIRECTORIES( {HELLO_SOURCE_DIR}/lib) </span></span></li><li class=""><span>SET(CMAKE_C_COMPILER g++) </span></li><li class="alt"><span>SET(SRC_LIST hello.cpp) </span></li><li class=""><span>INCLUDE_DIRECTORIES( {HELLO_SOURCE_DIR}/include)
- ADD_LIBRARY(util STATIC {SRC_LIST}) </span></li></ol></div><pre class="cpp" name="code" style="display: none;">SET(LIBRARY_OUTPUT_PATH
{SRC_LIST}) </span></li></ol></div><pre class="cpp" name="code" style="display: none;">SET(LIBRARY_OUTPUT_PATH
{HELLO_SOURCE_DIR}/lib) SET(CMAKE_C_COMPILER g++) SET(SRC_LIST hello.cpp) INCLUDE_DIRECTORIES(
HELLOSOURCEDIR/include)ADDLIBRARY(utilSTATIC
H
E
L
L
O
S
O
U
R
C
E
D
I
R
/
i
n
c
l
u
d
e
)
A
D
D
L
I
B
R
A
R
Y
(
u
t
i
l
S
T
A
T
I
C
{SRC_LIST})</pre>其中SET(LIBRARY_OUTPUT_PATH
HELLOSOURCEDIR/lib)定义了库生成的路径,LIBRARYOUTPUTPATH是一个内部变量,存放库生成路径。SET(SRCLISThello.c)是用来定义库文件需要的源文件。ADDLIBRARY(utilSTATIC
H
E
L
L
O
S
O
U
R
C
E
D
I
R
/
l
i
b
)
定
义
了
库
生
成
的
路
径
,
L
I
B
R
A
R
Y
O
U
T
P
U
T
P
A
T
H
是
一
个
内
部
变
量
,
存
放
库
生
成
路
径
。
S
E
T
(
S
R
C
L
I
S
T
h
e
l
l
o
.
c
)
是
用
来
定
义
库
文
件
需
要
的
源
文
件
。
A
D
D
L
I
B
R
A
R
Y
(
u
t
i
l
S
T
A
T
I
C
{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
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#查看安装目录