在前面一篇文章写了如何使用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 <stdio.h>
void rice_func();
#endif
CMakeLists.txt的内容如下:
SET(LIBRICE_SRC rice.c)
ADD_LIBRARY(rice STATIC ${LIBRICE_SRC})
制作库的工程模板制作好后,进行编译,在build目录下进行编译,如下:
$ cmake ..
省略。。。
$ make
省略。。。
$ cd lib
$ ls
CMakeFiles 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$ ls
rice.h
/usr/include/rice$
可以看到,已经安装到指定的目录。
有写的不对的地方,欢迎找作者探讨。
本文分享自 Rice 嵌入式开发技术分享 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!