CMake入门

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 <iostream>
int main(int argc,char** argv)
{
    std::cout<<"hello"<<std::endl;    
    return 0;
}
  1. 在CMakeLists.txt中写入
cmake_minimum_required (VERSION 2.8)#CMake 最低版本
project (Test01)#工程名称

set(CMAKE_C_COMPILER g++)
add_definitions(-std=c++11)



#防止源内构建
if ( ${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR} )
    message( FATAL_ERROR "In-source builds not allowed. 
            Please make a new directory (called a build directory) and run CMake from there. You may need to remove CMakeCache.txt." )
endif()

set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/build/bin)

add_executable(test_01 main.cpp)#test_01是有main.cpp生成的可执行文件

5)生成Makefile文件
在lab1文件目录下

cd build
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<iostream>

void share_print(int id){

    std::cout<<id<<std::endl;
}

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目录下

cd build
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 <iostream>
#include "lab2/SharePrint.h"
#include "test.h"
int main(int argc,char** argv)
{
    std::cout<<"this   aa"<<std::endl;    
    int id =2;
    share_print(id);

    std::cout<<"CMAKE_VERSION_MAX:"<<CMAKE_VERSION_MAX<<std::endl;
    std::cout<<"CMAKE_VERSION_MIN:"<<CMAKE_VERSION_MIN<<std::endl;
    return 0;
}

这里只是简单的添加了马上要生成的test.h头文件和对两个宏定义的变量的使用

4)修改lab1下面的CMakeLists.txt文件
在使用PROJECT指令后,PROJECT_SOURCE_DIR和PROJECT_BINARY_DIR已经被隐式的定义了。(这里的解释应该是错的)

cmake_minimum_required (VERSION 2.8)
project (Test01)

set(CMAKE_C_COMPILER g++)
add_definitions(-std=c++11)

#防止源内构建
if ( ${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR} )
    message( FATAL_ERROR "In-source builds not allowed. 
            Please make a new directory (called a build directory) and run CMake from there. You may need to remove CMakeCache.txt." )
endif()

set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/build/bin)
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目录下

cd build
cmake ..
make
./bin/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(CMAKE_C_COMPILER g++)
add_definitions(-std=c++11)

#防止源内构建
if ( ${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR} )
    message( FATAL_ERROR "In-source builds not allowed. 
            Please make a new directory (called a build directory) and run CMake from there. You may need to remove CMakeCache.txt." )
endif()

set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/build/bin)

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 <iostream>
#include "lab2/SharePrint.h"
#include "test.h"
int main(int argc,char** argv)
{
#ifdef HAVE_COUT
    std::cout<<"this   aa"<<std::endl; 
#endif   
    int id =2;
    share_print(id);
#ifdef HAVE_COUT
    std::cout<<"CMAKE_VERSION_MAX:"<<CMAKE_VERSION_MAX<<std::endl;
    std::cout<<"CMAKE_VERSION_MIN:"<<CMAKE_VERSION_MIN<<std::endl;
#endif
    return 0;
}
  1. 在lab1下面
cd build
cmake ..
make 
./bin/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
  1. 在lab1下面
cd build
cmake ..
make 
./bin/test_01 

就这样可以实现选择使用某个模块的代码

6 windows或者mac下`

make命令应该换成

cmake --build build --config release
posted @ 2020-07-31 17:32  cyssmile  阅读(204)  评论(0编辑  收藏  举报