CMake学习(3)
这里测试添加一个库
常见的场景是软件合作开发,然后拿到一个其他同事编写的库,需要加入到自己的项目中。
先说库文件,这里做个demo。
假定这个库就是一个简单的MathFunc.c文件和MathFunc.h文件,放在一个MathFunc文件夹下面,这个文件夹位于项目的源代码下,和CMakeLists.txt并列。MathFunc.c里面有一个gcd函数,计算两个无符号整数的最大公约数,头文件和源文件如下:
#ifndef __MATH_FUNC_H_ #define __MATH_FUNC_H_ //求最大公约数 unsigned int gcd(unsigned int a,unsigned b); #endif
源文件:
#include "MathFunc.h" //辗转相除法求余数 unsigned int gcd(unsigned int a,unsigned b) { unsigned int t,r; //swap value, make a larger than b if(a<b) { t=a; a=b; b=t; } while(b>0) { r=a%b; a=b; b=r; } return a; }
为了使用这个库,你当然需要编译这个源文件了,如何实现呢?
需要两步。
首先,需要在这个MathFunc文件夹下面写一个子CMakeLists.txt,内容很简单:
add_library(MathFunc MathFunc.c)
说明需要做一个Library。当然因为这个库文件很简单,所以就只有这么几行,如果是一个大的库,那就需要把它当做一个新的Cmake项目来理解就行了。
然后在主CMakeLists.h中最后面加入几行:
add_subdirectory (MathFunc) include_directories("${PROJECT_SOURCE_DIR}/MathFunc") target_link_libraries (step1 MathFunc)
通过使用add_subdirectory ,将使这个库中的CMakeLists.txt被Cmake调用,从而能够生成库,include_directories将包含检索的路径,target_link_libraries 告知要将这个库链接进去。
总结一下就是,CMake支持类似递归调用一样,在主CMakeLists文件下面,可以再把别的项目或者库的CMakeLists加进来。