目录
目标:
环境
创建静态和动态链接库
文件准备
构建
安装静态链接库
使用静态链接库和动态库
使用动态库
使用静态库
目标:
构建静态链接库和动态链接库,安装到系统,写一个程序使用安装的静态链接库。
环境
ubuntu18
cmake version 3.17.3
创建静态和动态链接库
文件准备
新建demo5-lib文件夹,包含内容如下
parallels@Lincoln:~/workspace/cmakedemo/demo5-lib$ ll
total 24
drwxrwxr-x 3 parallels parallels 4096 Jan 2 21:03 ./
drwxrwxr-x 7 parallels parallels 4096 Jan 2 20:38 ../
drwxrwxr-x 2 parallels parallels 4096 Jan 2 21:03 build/
-rw-r--r-- 1 parallels parallels 550 Jan 2 21:03 CMakeLists.txt
-rw-r--r-- 1 parallels parallels 672 Jan 2 20:56 DateUtils.c
-rw-r--r-- 1 parallels parallels 115 Jan 2 20:56 DateUtils.h
build 是空目录,用来做构建用
DateUtils.h代码
#ifndef DEMO_DATEUTILS_H
#define DEMO_DATEUTILS_H
//显示当前时间
void showNow();
#endif //DEMO_DATEUTILS_H
DateUtils.c代码
#include <stdio.h>
#include <time.h>
#include "DateUtils.h"
void showNow() {
time_t timep;
struct tm *p;
time(&timep);
p = gmtime(&timep);
printf("%d-", 1900 + p->tm_year); /*当前年份,从1900开始*/
printf("%d-", 1 + p->tm_mon); /*当前月份,范围是0-11*/
printf("%d ", p->tm_mday); /*当前月份日数,范围是1-31*/
printf("%d:", 8 + p->tm_hour); /*当前时,这里获取西方的时间,北京东八区时间+8*/
printf("%d:", p->tm_min); /*当前分*/
printf("%d\n", p->tm_sec); /*当前秒*/
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(demo5-lib)
#静态库
add_library(dateUtils_static STATIC DateUtils.c)
#动态库
add_library(dateUtils_shared SHARED DateUtils.c)
#指定静态库的名字是hello,要不然名字会和add_library的target一样,也就是:dateUtils_static
SET_TARGET_PROPERTIES(dateUtils_static PROPERTIES OUTPUT_NAME "hello")
#指定静态库的名字是hello,要不然名字会和add_library的target一样,也就是:dateUtils_shared
SET_TARGET_PROPERTIES(dateUtils_shared PROPERTIES OUTPUT_NAME "hello")
构建
安装静态链接库
安装到系统,以后可像使用系统库的方式使用。
可以在最后看到安装的路径
使用静态链接库和动态库
使用动态库
新建demo6-use-lib文件夹,内容如下:
parallels@Lincoln:~/workspace/cmakedemo/demo6-use-lib$ ll
total 20
drwxrwxr-x 3 parallels parallels 4096 Jan 2 21:38 ./
drwxrwxr-x 8 parallels parallels 4096 Jan 2 21:36 ../
drwxrwxr-x 3 parallels parallels 4096 Jan 2 21:45 build/
-rw-r--r-- 1 parallels parallels 126 Jan 2 21:38 CMakeLists.txt
-rw-rw-r-- 1 parallels parallels 78 Jan 2 21:36 main.c
main.c
#include <dateutil/DateUtils.h>
int main() {
showNow();
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(demo6-use-lib)
add_executable(main main.c)
#使用连接库dateUtil
target_link_libraries(main dateUtil)
构建
运行
运行报错,使用ldd查看找不到库文件
查看文件确实存在:静态库libdateUtil.a和 动态库 libdateUtil.so
而且能看出默认使用的是动态库
遇到这种问题,可以使用ldconfig更新下库的缓存文件
使用静态库
修改CMakeLists.txt中的
target_link_libraries(main dateUtil) 为 target_link_libraries(main dateUtil.a) 备注:也可以使用 dateUtil.so显示使用动态库
重新编译运行后,使用ldd已经看不到动态链接库了。也能正常运行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)