点击蓝字
关注我们
在前面一篇文章写了如何使用CMake编译“hello world”。这一篇写写构建静态库和动态库。
上一文章链接:《CMake,大型项目采用的构建工具》
对于静态库和动态库的了解,可以看看之前的文章:
静态库:《静态链接库的实现》
动态库:《动态链接库的实现》
在上一篇文章中,我们说了内部构建和外部构建的区别,接下来的例子我们使用外部构建。我们在工程目录下建立CMakeLists.txt,lib目录,build目录。
CMakeLists.txt的内容如下:
PROJECT(RICE)ADD_SUBDIRECTORY(lib lib) #指定编译输出位置
在lib目录下建立源文件rice.c和rice.h,建立CMakeLists.txt文件。
rice.c的内容如下:#include "rice.h"void rice_func(){ printf("rice func\n");}
rice.h的内容如下:
#ifndef __RICE_H#define __RICE_H#include void rice_func();#endif
CMakeLists.txt的内容如下:
SET(LIBRICE_SRC rice.c)ADD_LIBRARY(rice STATIC ${LIBRICE_SRC})
制作库的工程模板制作好后,进行编译,在build目录下进行编译,如下:
$ cmake ..省略。。。$ make省略。。。$ cd lib$ lsCMakeFiles cmake_install.cmake librice.a Makefile$
编译完,在lib目录下生成了librice.a这个静态库。在上面的CMakeLists.txt中,多了一个指令ADD_LIBRARY
:
指令 | ADD_LIBRARY |
语法 | ADD_LIBRARY(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 source2 ... sourceN) |
说明 | 类型有三种:SHARED,动态库STATIC,静态库MODULE,在使用 dyld 的系统有效,如果不支持 dyld,则被当作 SHARED 对待。EXCLUDE_FROM_ALL,参数的意思是这个库不会被默认构建,除非有其他的组件依赖或者手工构建。 |
根据ADD_LIBRARY指令的描述,在上面的例子中,很清楚的理解是生成静态库的操作。
那么将上面的ADD_LIBRARY(rice STATIC ${LIBRICE_SRC})替换成
ADD_LIBRARY(rice SHARED ${LIBRICE_SRC})编译生成的就是动态库。
安装共享库和头文件:只需要对lib文件夹下的CMakeLists.txt增加install指令,如下:
SET(LIBRICE_SRC rice.c)ADD_LIBRARY(rice SHARED ${LIBRICE_SRC})INSTALL(TARGETS rice LIBRARY DESTINATION lib) #安装共享库INSTALL(FILES rice.h DESTINATION include/rice) #安装头文件
执行命令:
$ cmake -DCMAKE_INSTALL_PREFIX=/usr ..省略。。。$ make省略。。。$ make install省略。。。#查看共享库是否安装成功/usr/lib$ ls librice.so librice.so/usr/lib$#查看头文件是否安装成功/usr/include/rice$ lsrice.h/usr/include/rice$
可以看到,已经安装到指定的目录。有写的不对的地方,欢迎找作者探讨。。
我将持续更新文章和学习资料
可加作者的微信一起交流学习
---作者微信号:wueroo1314---
获取交流群,请添加作者微信
饭仔DIY
微信号 : Rice_DIY
技术 | 开源 | 分享
长按关注。。。