CMakeLists 的使用,大型工程使用cmake 的构件过程
2016-07-21 11:19
375 查看
CMake是一个跨平台的程序构建工具,比如起自己编写Makefile方便很多。
简单介绍一下CMKALIST 的简单实用
1.构建一个工程的时候,需要做的几件事情(如果下面几件事你知道怎么做了,多大的工程就都不是问题了):
A.源代码在哪里?
B.头文件在哪里?
C.怎么生成静态或者动态库?
D.程序链接的静态库在哪里?
E.如果工程的代码存放在很多地方,那又该怎么找到它们呢?
A.工程文件如下(只有一个helloworld.cpp源文件):
ciw@ubuntu:~/my_projects/test$ tree .
└── helloworld.cpp
B.这时候,我们要写一个CMakeLists.txt(就3句代码):
PROJECT(hello) #定义整个CMake的工程名
FILE(GLOB SOURCE "./*.cpp") #告诉CMake:工程的源文件在哪里?
ADD_EXECUTABLE(hello ${SOURCE}) #告诉CMake:我们要生成可执行文件(hello),并且源文件是由上面定义的
这样就可以在目录下生成一个hello可执行文件了。
A.代码分布如下(main.cpp是main函数,里面调用了hello.h声明的SayHello,定义在hello.cpp中):
ciw@ubuntu:~/my_projects/test$ tree .
├── CMakeLists.txt
├── hello
│ └── hello.cpp
├── include
│ └── hello.h
└── main
└── main.cpp
B.main的代码:
#include "hello.h“
int main()
{
SayHello();
return 0;
}
C.CMakeLists.txt:
1 PROJECT(hello_2)
2
3 FILE(GLOB SOURCE_1 "${CMAKE_SOURCE_DIR}/main/*.cpp") //下面2句告诉CMake,源文件在哪里?main.cpp
4 FILE(GLOB SOURCE_2 "${CMAKE_SOURCE_DIR}/hello/*.cpp")//程序必须链接到hello.cpp里面的SayHello
5
6 INCLUDE_DIRECTORIES("${CMAKE_SOURCE_DIR}/include/")//告诉CMake头文件在哪里?
7
8 ADD_EXECUTABLE(hello_2 ${SOURCE_1} ${SOURCE_2})
A.工程描述:
该工程由一个静态库和一个可执行文件组成,头文件和源文件都不在同一个目录,并且CMake也是独立在一个目录
B.代码分布:
ciw@ubuntu:~/my_projects/test$ tree .
test //工程根目录
├── cmake //CMake目录:代码和CMake编译目录分离
│ ├── bin
│ │ └── main //生成后的可执行文件
│ ├── CMakeLists.txt
│ ├── lib
│ │ └── libhello.a //生成后的静态库
│ └── src
│ ├── CMakeLists.txt
│ ├── hello
│ │ └── CMakeLists.txt
│ └── main
│ └── CMakeLists.txt
├── hello //hello静态库的源代码
│ └── hello.cpp
├── include //头文件
│ └── hello.h
└── main //可执行文件的源代码目录
└── main.cpp
可以看出,CMake里面的每一个子目录都有一个CMakeLists.txt
C.编译该工程的过程:
(a).首先,需要给CMake的一个总入口,这个CMake设置一些全局的变量(cmake/CMakeLists.txt):
PROJECT(hello_3)
SET(PROJECT_ROOT_PATH "${CMAKE_SOURCE_DIR}/../") #工程的根目录,即test
SET(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin/") #可执行生成后存放的目录(CMAKE_SOURCE_DIR是cmake目录)
SET(LIBRARY_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/lib/") #静态库生成后存放的目录
INCLUDE_DIRECTORIES("${PROJECT_ROOT_PATH}/include/") #告诉CMake头文件在哪里?
LINK_DIRECTORIES("${CMAKE_SOURCE_DIR}/lib/") #告诉CMake静态库在哪里?
ADD_SUBDIRECTORY(src) #多目录,把src目录加进来,src里面才是真正编译main和hello的
(b).src目录下的CMakeList.txt,这个CMake只是简单地把main目录和hello目录链接起来:
ADD_SUBDIRECTORY(main)
ADD_SUBDIRECTORY(hello)
(c).hello静态库:
FILE(GLOB SOURCE_1 "${PROJECT_ROOT_PATH}/hello/*.cpp") #告诉CMake源文件在哪里?
ADD_LIBRARY(hello STATIC ${SOURCE_1}) #告诉CMake生成的是一个静态库
(d).main可执行文件:
FILE(GLOB SOURCE_1 "${PROJECT_ROOT_PATH}/main/*.cpp") #告诉CMake源文件在哪里?
ADD_EXECUTABLE(main ${SOURCE_1}) #告诉CMake生成一个main可执行文件
TARGET_LINK_LIBRARIES(main hello) #告诉CMake静态库在哪里?
整个编译的过程就是这样了,最主要的是记住上面”构建一个工程的时候,需要做的几件事情:头文件,源文件,静态库这个元素“,那么再复杂的工程都是这样一步一步构建的
结果如下
全部构件代码存放 github :
https://github.com/NickXhh/CMKAE
需要的请下载
简单介绍一下CMKALIST 的简单实用
第一:首先构建比较简单的工程
1.构建一个工程的时候,需要做的几件事情(如果下面几件事你知道怎么做了,多大的工程就都不是问题了):A.源代码在哪里?
B.头文件在哪里?
C.怎么生成静态或者动态库?
D.程序链接的静态库在哪里?
E.如果工程的代码存放在很多地方,那又该怎么找到它们呢?
第二:下面从一个最简单的HelloWorld开始,然后一步一步构建一个比较复杂的工程:
A.工程文件如下(只有一个helloworld.cpp源文件):ciw@ubuntu:~/my_projects/test$ tree .
└── helloworld.cpp
B.这时候,我们要写一个CMakeLists.txt(就3句代码):
PROJECT(hello) #定义整个CMake的工程名
FILE(GLOB SOURCE "./*.cpp") #告诉CMake:工程的源文件在哪里?
ADD_EXECUTABLE(hello ${SOURCE}) #告诉CMake:我们要生成可执行文件(hello),并且源文件是由上面定义的
这样就可以在目录下生成一个hello可执行文件了。
第三:下面,说一个带头文件的,而且文件都是存放在不同地方:
A.代码分布如下(main.cpp是main函数,里面调用了hello.h声明的SayHello,定义在hello.cpp中):ciw@ubuntu:~/my_projects/test$ tree .
├── CMakeLists.txt
├── hello
│ └── hello.cpp
├── include
│ └── hello.h
└── main
└── main.cpp
B.main的代码:
#include "hello.h“
int main()
{
SayHello();
return 0;
}
C.CMakeLists.txt:
1 PROJECT(hello_2)
2
3 FILE(GLOB SOURCE_1 "${CMAKE_SOURCE_DIR}/main/*.cpp") //下面2句告诉CMake,源文件在哪里?main.cpp
4 FILE(GLOB SOURCE_2 "${CMAKE_SOURCE_DIR}/hello/*.cpp")//程序必须链接到hello.cpp里面的SayHello
5
6 INCLUDE_DIRECTORIES("${CMAKE_SOURCE_DIR}/include/")//告诉CMake头文件在哪里?
7
8 ADD_EXECUTABLE(hello_2 ${SOURCE_1} ${SOURCE_2})
第四:最后说一个比较复杂的工程,详细说明大型工程的构件过程
A.工程描述:该工程由一个静态库和一个可执行文件组成,头文件和源文件都不在同一个目录,并且CMake也是独立在一个目录
B.代码分布:
ciw@ubuntu:~/my_projects/test$ tree .
test //工程根目录
├── cmake //CMake目录:代码和CMake编译目录分离
│ ├── bin
│ │ └── main //生成后的可执行文件
│ ├── CMakeLists.txt
│ ├── lib
│ │ └── libhello.a //生成后的静态库
│ └── src
│ ├── CMakeLists.txt
│ ├── hello
│ │ └── CMakeLists.txt
│ └── main
│ └── CMakeLists.txt
├── hello //hello静态库的源代码
│ └── hello.cpp
├── include //头文件
│ └── hello.h
└── main //可执行文件的源代码目录
└── main.cpp
可以看出,CMake里面的每一个子目录都有一个CMakeLists.txt
C.编译该工程的过程:
(a).首先,需要给CMake的一个总入口,这个CMake设置一些全局的变量(cmake/CMakeLists.txt):
PROJECT(hello_3)
SET(PROJECT_ROOT_PATH "${CMAKE_SOURCE_DIR}/../") #工程的根目录,即test
SET(EXECUTABLE_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/bin/") #可执行生成后存放的目录(CMAKE_SOURCE_DIR是cmake目录)
SET(LIBRARY_OUTPUT_PATH "${CMAKE_SOURCE_DIR}/lib/") #静态库生成后存放的目录
INCLUDE_DIRECTORIES("${PROJECT_ROOT_PATH}/include/") #告诉CMake头文件在哪里?
LINK_DIRECTORIES("${CMAKE_SOURCE_DIR}/lib/") #告诉CMake静态库在哪里?
ADD_SUBDIRECTORY(src) #多目录,把src目录加进来,src里面才是真正编译main和hello的
(b).src目录下的CMakeList.txt,这个CMake只是简单地把main目录和hello目录链接起来:
ADD_SUBDIRECTORY(main)
ADD_SUBDIRECTORY(hello)
(c).hello静态库:
FILE(GLOB SOURCE_1 "${PROJECT_ROOT_PATH}/hello/*.cpp") #告诉CMake源文件在哪里?
ADD_LIBRARY(hello STATIC ${SOURCE_1}) #告诉CMake生成的是一个静态库
(d).main可执行文件:
FILE(GLOB SOURCE_1 "${PROJECT_ROOT_PATH}/main/*.cpp") #告诉CMake源文件在哪里?
ADD_EXECUTABLE(main ${SOURCE_1}) #告诉CMake生成一个main可执行文件
TARGET_LINK_LIBRARIES(main hello) #告诉CMake静态库在哪里?
整个编译的过程就是这样了,最主要的是记住上面”构建一个工程的时候,需要做的几件事情:头文件,源文件,静态库这个元素“,那么再复杂的工程都是这样一步一步构建的
结果如下
全部构件代码存放 github :
https://github.com/NickXhh/CMKAE
需要的请下载
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Extjs4.0 最新最全视频教程
- OpenERP 的XML-RPC的实例+many2many,one2many,many2one...
- CSS3属性教程与案例分享
- 关于指针的一些事情
- jquery教程靠边站,一分钱不花让你免费学会jquery
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- autoit入门教程小结第1/5页
- 用Photoshop 制作草地效果简明教程
- 比较完整简洁的Flash处理XML文档数据教程 上篇第1/3页
- VBS基础编程教程 (第1篇)
- SQLite教程(十一):临时文件
- VBS基础编程教程 (第3篇)
- VBS教程:运算符-运算符(+)
- PostgreSQL教程(十):性能提升技巧
- PostgreSQL教程(二):模式Schema详解
- PostgreSQL教程(十三):数据库管理详解
- PostgreSQL教程(八):索引详解
- PostgreSQL教程(三):表的继承和分区表详解