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

3 篇文章 0 订阅

 

目录

目标:

环境

创建静态和动态链接库

文件准备

构建

安装静态链接库

使用静态链接库和动态库

使用动态库

使用静态库


 

目标:

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

环境

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

 

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CMake是一个跨平台的编译工具,可以用于编译和链接静态库动态库。下面是使用CMake编译和链接静态库动态库的步骤: ## 编译静态库 1. 创建一个CMake项目,包含要编译的源代码文件和头文件。 2. 创建一个CMakeLists.txt文件,并添加以下代码: ``` # 设置项目名称和版本号 project(mylib VERSION 1.0) # 添加要编译的源代码文件 add_library(mylib STATIC src/mylib.cpp) # 将头文件目录添加到include路径中 target_include_directories(mylib PUBLIC ${PROJECT_SOURCE_DIR}/include) # 设置安装目录 install(TARGETS mylib DESTINATION lib) install(FILES include/mylib.h DESTINATION include) ``` 3. 在项目目录下创建一个build目录,进入该目录并运行以下命令: ``` cmake .. make ``` 4. 编译完成后,静态库文件将生成在build/lib目录下。 ## 编译动态库 1. 创建一个CMake项目,包含要编译的源代码文件和头文件。 2. 创建一个CMakeLists.txt文件,并添加以下代码: ``` # 设置项目名称和版本号 project(mylib VERSION 1.0) # 添加要编译的源代码文件 add_library(mylib SHARED src/mylib.cpp) # 将头文件目录添加到include路径中 target_include_directories(mylib PUBLIC ${PROJECT_SOURCE_DIR}/include) # 设置安装目录 install(TARGETS mylib DESTINATION lib) install(FILES include/mylib.h DESTINATION include) ``` 3. 在项目目录下创建一个build目录,进入该目录并运行以下命令: ``` cmake .. make ``` 4. 编译完成后,动态库文件将生成在build/lib目录下。 ## 链接静态库 1. 创建一个CMake项目,包含要编译的源代码文件和头文件。 2. 创建一个CMakeLists.txt文件,并添加以下代码: ``` # 设置项目名称和版本号 project(myapp VERSION 1.0) # 添加要编译的源代码文件 add_executable(myapp src/main.cpp) # 将头文件目录添加到include路径中 target_include_directories(myapp PUBLIC ${PROJECT_SOURCE_DIR}/include) # 添加静态库 add_library(mylib STATIC IMPORTED) set_target_properties(mylib PROPERTIES IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/lib/libmylib.a) target_link_libraries(myapp mylib) ``` 3. 在项目目录下创建一个build目录,进入该目录并运行以下命令: ``` cmake .. make ``` 4. 链接完成后,可执行文件将生成在build目录下。 ## 链接动态库 1. 创建一个CMake项目,包含要编译的源代码文件和头文件。 2. 创建一个CMakeLists.txt文件,并添加以下代码: ``` # 设置项目名称和版本号 project(myapp VERSION 1.0) # 添加要编译的源代码文件 add_executable(myapp src/main.cpp) # 将头文件目录添加到include路径中 target_include_directories(myapp PUBLIC ${PROJECT_SOURCE_DIR}/include) # 添加动态库 add_library(mylib SHARED IMPORTED) set_target_properties(mylib PROPERTIES IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/lib/libmylib.so) target_link_libraries(myapp mylib) ``` 3. 在项目目录下创建一个build目录,进入该目录并运行以下命令: ``` cmake .. make ``` 4. 链接完成后,可执行文件将生成在build目录下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值