ubuntu中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 
int main(int argc,char** argv)
{
    std::cout<<"hello"<
  1. 在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"<
  1. 在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
  1. 在lab1下面(这里还没说道clean,自己手动删除之前cmake和make产生的文件)
cmake .
make 
./test_01 

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

你可能感兴趣的:(ubuntu中CMake入门)