cmake 与autoconf automake使用的举例

目录

一、简介

二、示例过程

1、源文件

2、生成CmakeLists.txt

3、使用cmake命令生成Makefile编译

三、总结


一、简介

CMake是开源、跨平台的构建工具,在需要编译的目录中,编辑简单的CMakeLists.txt配置文件,即可通过cmake命令来生成Makefile。非常好用。

 

二、示例过程

1、源文件

在inc目录下为头文件

在src目录下为源文件

其中编译过程依赖于libm.so

root@wangxinyu-PC:/home/wangxinyu/work/temp/cmaket# tree
.
├── inc
│   └── example.h
└── src
    └── example.c

root@wangxinyu-PC:/home/wangxinyu/work/temp/cmaket# cat src/example.c 
#include <stdio.h>
#include <math.h>
#include "example.h"

int is_prime_number(int num)
{
	int i = 0;
	int j = 0;
	int max = 0;
	int prime = 1;

	max = sqrt(num);

	for(i = 2; i < num; i++)
	{
		for(j = 2; j <= max; j++)
		{
			if(num == i*j )
			{
				prime = 0;
				break;
			}
		}
		if(0 == prime)
			break;
	}

	return prime;
}

int main(void)
{
	int i = 0;

	for(i = 2; i < 100; i++)
	{
		if(is_prime_number(i))
		{
			printf("%4d is prime number, WXY=%s.\n", i, WXY);
		}
	}
}
root@wangxinyu-PC:/home/wangxinyu/work/temp/cmaket# cat inc/example.h 
#define WXY "wangxinyu"
root@wangxinyu-PC:/home/wangxinyu/work/temp/cmaket#

 

2、生成CmakeLists.txt

root@wangxinyu-PC:/home/wangxinyu/work/temp/cmaket# vi CMakeLists.txt 
  1 cmake_minimum_required(VERSION 3.11)
  2 PROJECT(example)
  3 
  4 INCLUDE_DIRECTORIES(./inc)
  5 LINK_DIRECTORIES("/lib/x86_64-linux-gnu/")
  6 
  7 AUX_SOURCE_DIRECTORY(src DIR_SRC)
  8 
  9 add_executable(example ${DIR_SRC})
 10 TARGET_LINK_LIBRARIES(example m)

Cmake有一定语法结构,与Makefile相似。在这里仅举简单示例,不做深入讲解,意在了解过程。

第4行指定了头文件路径。

第5行指定库的路径 。

第7行添加src为源文件目录

第9行源文件生成example可执行文件

第10行生成时引用libm.so

 

3、使用cmake命令生成Makefile编译

oot@wangxinyu-PC:/home/wangxinyu/work/temp/cmaket# cmake .
-- The C compiler identification is GNU 8.3.0
-- The CXX compiler identification is GNU 8.3.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/wangxinyu/work/temp/cmaket
root@wangxinyu-PC:/home/wangxinyu/work/temp/cmaket# ls
CMakeCache.txt  CMakeFiles  cmake_install.cmake  CMakeLists.txt  inc  Makefile  src
root@wangxinyu-PC:/home/wangxinyu/work/temp/cmaket# make
Scanning dependencies of target example
[ 50%] Building C object CMakeFiles/example.dir/src/example.c.o
[100%] Linking C executable example
[100%] Built target example
root@wangxinyu-PC:/home/wangxinyu/work/temp/cmaket# ls
CMakeCache.txt  CMakeFiles  cmake_install.cmake  CMakeLists.txt  example  inc  Makefile  src
root@wangxinyu-PC:/home/wangxinyu/work/temp/cmaket# ./example 
   2 is prime number, WXY=wangxinyu.
   3 is prime number, WXY=wangxinyu.
   5 is prime number, WXY=wangxinyu.
   7 is prime number, WXY=wangxinyu.
  11 is prime number, WXY=wangxinyu.
......

 

三、总结

相比automake生成Makefile, cmake的生成过程非常简单,只需配置CmakeLists.txt一个文件。简单的背后是复杂,写一个好的CamkeLists.txt文件,

不比写Makefile轻松,其大的优势更在于跨平台。