CMake入门3之 静态链接库和动态链接库

 

目录

目标:

环境

创建静态和动态链接库

文件准备

构建

安装静态链接库

使用静态链接库和动态库

使用动态库

使用静态库


 

目标:

构建静态链接库和动态链接库,安装到系统,写一个程序使用安装的静态链接库。

环境

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已经看不到动态链接库了。也能正常运行。

 

 


版权声明:本文为java_yanglikun原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。