1.首先安装CMake
sudo apt-get install cmake
2.创建最简单的cmake例子
1)打开终端先创建一个文件夹
mkdir lab1
cd lab1
2)在lab1目录下创建两个文件
touch main.cpp CMakeLists.txt
3)在main.cpp中写入
#include
int main(int argc,char** argv)
{
std::cout<<"hello"<
- 在CMakeLists.txt中写入
cmake_minimum_required (VERSION 2.8)#CMake 最低版本
project (Test01)#工程名称
add_executable(test_01 main.cpp)#test_01是有main.cpp生成的可执行文件
5)生成Makefile文件
在lab1文件目录下
cmake .
make
3. 添加子项目
正常开发每个人会单独开发自己的部分,所以需要将一个子项目加入主项目中
1)首先在lab1目录下创建新的文件夹lab2,并添加三个文件
mkdir lab2
cd lab2
touch SharePrint.h SharePrint.cpp CMakeLists.txt
2)在SharePrint.h中添加
void share_print(int id);
3)在SharePrint.cpp中添加
#include
void share_print(int id){
std::cout<
3)在lab2的CMakeLists.txt中加入
add_library(shareprint SharePrint.cpp)#就是为了生成libshareprint.a
4)修改lab1下的CMakeLists.txt
cmake_minimum_required (VERSION 2.8)
project (Test01)
add_subdirectory(lab2)
set (EXTRA_LIBS ${EXTRA_LIBS} shareprint)
add_executable(test_01 main.cpp)
target_link_libraries(test_01 ${EXTRA_LIBS})
这里其实简单就是设置EXTRA_LIBS 为shareprint,然后讲shareprint链接到test_01上
5)在lab1目录下(这里还没说clean,自己手动删除之前cmake和make产生的文件)
cmake .
make
4.利用CMakeLists.txt生成头文件
1)在lab1目录下创建test.h.in文件
touch test.h.in
2)在test.h.in中添加
#define CMAKE_VERSION_MAX @CMAKE_VERSION_MAX@
#define CMAKE_VERSION_MIN @CMAKE_VERSION_MIN@
这里CMAKE_VERSION_MAX CMAKE_VERSION_MIN 是我随便取得名字
@@ 中间的变量可以通过配置CMakeLists.txt来生成
3)在lab1下的main.cpp中改为
#include
#include "lab2/SharePrint.h"
#include "test.h"
int main(int argc,char** argv)
{
std::cout<<"this aa"<
这里只是简单的添加了马上要生成的test.h头文件和对两个宏定义的变量的使用
4)修改lab1下面的CMakeLists.txt文件
在使用PROJECT指令后,PROJECT_SOURCE_DIR和PROJECT_BINARY_DIR已经被隐式的定义了。(这里的解释应该是错的)
cmake_minimum_required (VERSION 2.8)
project (Test01)
set (PROJECT_SOURCE_DIR $HOME/workspace/lab1)
set (PROJECT_BINARY_DIR $HOME/workspace/lab1)
include_directories("${PROJECT_SOURCE_DIR}")
#设置两个宏定义变量的值
set(CMAKE_VERSION_MIN 2)
set(CMAKE_VERSION_MAX 3)
configure_file(
"${PROJECT_SOURCE_DIR}/test.h.in"#用于生成头文件h.in文件的位置
"${PROJECT_BINARY_DIR}/test.h"#生成的头文件放在什么地方
)
add_subdirectory(lab2)
set (EXTRA_LIBS ${EXTRA_LIBS} shareprint)
add_executable(test_01 main.cpp)
target_link_libraries(test_01 ${EXTRA_LIBS} )
5)在lab1目录下(这里还没说道clean,自己手动删除之前cmake和make产生的文件)
cmake .
make
./test_01
5.判断系统中是否存在某个函数
1)首先要使用CheckFunctionExists库,调用里面的check_function_exists函数
修改在lab1下的CMakeLists.txt
cmake_minimum_required (VERSION 2.8)
project (Test01)
include (CheckFunctionExists)
check_function_exists (cout HAVE_COUT)
set (PROJECT_SOURCE_DIR $HOME/workspace/lab1)
set (PROJECT_BINARY_DIR $HOME/workspace/lab1)
include_directories("${PROJECT_BINARY_DIR}")
set(CMAKE_VERSION_MIN 2)
set(CMAKE_VERSION_MAX 3)
configure_file(
"${PROJECT_SOURCE_DIR}/test.h.in"
"${PROJECT_BINARY_DIR}/test.h"
)
add_subdirectory(lab2)
set (EXTRA_LIBS ${EXTRA_LIBS} shareprint)
add_executable(test_01 main.cpp)
target_link_libraries(test_01 ${EXTRA_LIBS} )
2)修改test.h.in
#define CMAKE_VERSION_MAX @CMAKE_VERSION_MAX@
#define CMAKE_VERSION_MIN @CMAKE_VERSION_MIN@
#cmakedefine HAVE_COUT
#cmakedefine HAVE_COUT #的意思是如果系统有满足CMakeLists.txt判断函数的存在,就会在相应的头文件中进行宏定义
3)修改mian.cpp
#include
#include "lab2/SharePrint.h"
#include "test.h"
int main(int argc,char** argv)
{
#ifdef HAVE_COUT
std::cout<<"this aa"<
- 在lab1下面(这里还没说clean,自己手动删除之前cmake和make产生的文件)
cmake .
make
./test_01
6. 利用option实现是否使用某个模块
1).在CMakeLists.txt中添加
option(
USE_SHARE_PRINT
"use libshareprint.a" ON)
这里就是通过改变 ON或者OFF,默认不填为OFF
2)在test.h.in中添加
#cmakedefine USE_SHARE_PRINT
这里如果选择ON,生成的test.h文件中就会有#define USE_SHARE_PRINT,否者就没有
3)修改main.cpp
#ifdef USE_SHARE_PRINT
share_print(id);
#endif
- 在lab1下面(这里还没说道clean,自己手动删除之前cmake和make产生的文件)
cmake .
make
./test_01
就这样可以实现选择使用某个模块的代码