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

2023-05-16

 

目录

目标:

环境

创建静态和动态链接库

文件准备

构建

安装静态链接库

使用静态链接库和动态库

使用动态库

使用静态库


 

目标:

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

环境

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(使用前将#替换为@)

CMake入门3之 静态链接库和动态链接库 的相关文章

  • Visual Studio 将新文件放入错误的目录

    我使用 cmake 和 Visual Studio 并具有以下目录结构 workspace CMakeLists txt project1 src project2 src build 这背后的想法是源外构建 以便 cmake 生成的构建文
  • CMake+Xcode:应用程序存档失败,具体取决于同一解决方案中的库。在 BUILD_TREE 而不是 Xcode/DerivedData 中构建 Archive?

    几周前 我们移植了代码库以使用 CMake 进行构建管理 我们现在意识到 当我们试图做到这一点时 存在一个重大问题Archive依赖于同一 Xcode 解决方案中构建的一个 或多个 库的应用程序 链接器失败 因为它找不到所依赖的库 并且该库
  • 即使 CMake 中的 WITH_CUDA=ON,OpenCV 也不会使用 CUDA 进行构建

    我尝试使用 CMake GUI 版本 构建 OpenCV 3 1 以启用 Cuda 我已经安装了 Cuda 7 5 64 位版本 CMake 自动找到了 Cuda 工具包的正确路径 我确保WITH CUDA值设置为ON 并按下配置 这是我对
  • Windows 中 CMake 的默认生成器是什么?

    在一台 PC 上运行 CMake 时 CMake 默认生成 NMake 文件 另一方面 它生成一个 Visual Studio 项目 我知道我可以通过添加来覆盖默认值 G NMake Makefiles 到我的 CMake 语句的末尾 但我
  • 查找带有 Anaconda cmake 前缀的 boost-python3

    DLDR如何将 cmake 指向 boost python3 库 cmake 不会自动检测到它 我正在尝试建立caffe https github com BVLC caffe对于 Python 3 6 使用提供的 cmake 我的系统规格
  • 使用 CMAKE (VISUAL STUDIO) 链接调试和发布库

    已经有一个Thread https stackoverflow com q 2209929 293195这并没有真正帮助 我希望能够链接例如Foo lib for Release配置和Foo d lib for Debug配置 我怎样才能实
  • CMake 错误“找不到要添加属性的目标”

    在我的 CMakeLIsts txt 文件中我这样写 set LIBHELLO SRC hello c set target properties hello static PROPERTIES OUTPUT NAME hello get
  • CMake 64 位和 SFML 64 位

    我正在尝试使用适用于 Windows 的 CMake 64 位和 SFML 2 5 1 64 位构建 C 项目 当我在项目上运行 cmake 时 我收到一条错误消息 我能让它工作的唯一方法是改变CMAKE PREFIX PATH指向 SFM
  • 如何重新安装最新的cmake版本?

    我想在Linux环境下安装cmake的最新版本 我安装了 cmake 3 5 版 但某些应用程序不支持 我尝试通过卸载当前版本来升级它 但是当我使用 sudo apt get install cmake 重新安装时 我重新安装了相同的版本
  • 使用 OpenCL 支持构建 OpenCV

    在 CMake 中 我使用 OpenCL Enable ON 构建了 OpenCV 它自动检测到OPENCL INCLUDE DIR路径但是OPENCL LIBRARY即使单击配置后也是空的 为了OPENCL LIBRARY我也没有看到浏览
  • 编辑 CMakeLists.txt 以使用 -fPIC 进行编译

    我正在尝试为名为 libnifalcon 的 NOVINT Falcon 安装驱动程序 我使用 cmake 创建 make 文件 但是当我运行 make 时出现错误 Linking CXX shared library lib libnif
  • grpc找不到protobuf库

    我检查了 grpc 安装并完成了构建和安装 现在当我尝试 find package gRPC CONFIG REQUIRED I get CMake Error at CMakeLists txt 15 find package Found
  • 如何将脚本的依赖项添加到 CMake 中的目标?

    链接我的程序后 我需要对其执行一些后处理 我添加了一个add custom command TARGET 效果很好 但是 这个额外的自定义命令运行一个脚本 未生成 它已签入代码库 并且我希望如果该脚本发生更改 目标将被视为过时 以便正确重建
  • clang-tidy - 忽略第三方标头代码

    我正在为我的项目使用 CMake 并且我想向项目引入 clang tidy 检查 我用于此目的CMAKE CXX CLANG TIDY and clang tidy用于检查设置的文件 我想在 CI 中使用警告作为错误来可靠地检查提交是否引入
  • 如何在 Windows 中使用 cmake 构建和链接 google benchmark

    我正在尝试构建 google benchmark 并使用 cmake 将其与我的库一起使用 我已经成功构建了 google benchmark 并使用 cmake 成功运行了所有测试 不幸的是 我无法使用 cmake 或 cl 将其与 Wi
  • libSDL、CMake 和 Mac OS X Lion

    我正在尝试在我的Mac上编译cmake项目 但它取决于SDL框架 我安装了这个框架 在 cmake 之后向我报告找不到 libSDL 我自己设置了以下导出变量 按照 cmake 的建议 export SDL INCLUDE DIR Libr
  • CMake 和 Visual Studio:如何获得快速、安静的命令行构建?

    我有一个 cmake 项目 它成功地完成了我想要的一切 但我有大约 100 个文件 当我只需要重新编译一个文件时 我厌倦了每次看到生成的巨大输出 每个文件 30 行 明确地说 我正在编译cmake build 得到这个结果 我需要传递给编译
  • CMake Xcode生成器创建了一个无法构建的项目

    我有一个使用 CMake 构建系统的 C 项目 我使用 MacBook Pro 进行开发 因此当我使用终端时 一切都非常顺利 我可以构建我的项目 然而 今天我发现我可以在使用 CMake 生成器创建相应的项目后使用 Xcode gt cma
  • 在 VS2017 下使用 Conan 和 CMake 项目进行依赖管理

    我正在尝试使用 CMake 与 VS2017 集成为 C 设置一个开发环境 以便在 Linux x64 下进行编译 为了更好地管理依赖关系 我选择使用 Conan 但我对这个软件还很陌生 我想知道让 VS2017 识别项目依赖关系的最佳方法
  • 使用 cmake 处理头文件依赖关系

    我正在一个小型 C 项目上使用 CMake 到目前为止 它运行得很好 有一点点 x 当我更改头文件时 通常需要重新编译许多源文件 直接或间接包含它的文件 但是 cmake 似乎只检测到some的源文件被重新编译 导致损坏状态 我可以通过清除

随机推荐

  • 1024

    听说今天发帖能有1024勋章 xff1f
  • 神奇!明明是 socket,被我玩成了 http!

    颓废青年 xff0c 快出来挨打 xff01 点击上方 Java极客技术 xff0c 选择 设为星标 后台回复 java xff0c 获取Java知识体系 面试必看资料 资料会持续更新 xff0c 已更新第四次 xff01 文章精品专栏 记
  • python画图程序

    usr bin python coding utf 8 import wx import wx lib buttons as buttons import wx adv as adv import wx lib colourselect a
  • 升级到tensorflow2.0,我整个人都不好了

    版本升级到 tensorflow 2 0 的悲惨经历 没事别升级 Tensorflow 2 0发布已经有一段时间了 xff0c 各种基于新API的教程看上去的确简单易用 xff0c 一个简单的mnist手写识别只需要下面不到20行代码就OK
  • 修改conda环境和缓存默认路径

    默认情况下 xff0c conda 创建的新环境 以及过往安装的模块缓存都存储在用户目录下 xff0c 这一点不会在 conda xff08 user specific xff09 配置文件 HOME condarc 中体现出来 xff0c
  • 融合人体姿态估计和目标检测的学生课堂行为识别

    融合人体姿态估计和目标检测的学生课堂行为识别 参考网 摘要 xff1a 在課堂教学中 xff0c 人工智能技术可以帮助实现学生行为分析自动化 xff0c 让教师能够高效且直观地掌握学生学习行为投入的情况 xff0c 为后续优化教学设计与实施
  • Python实例详解pdfplumber读取PDF写入Excel

    一 Python操作PDF 13大库对比 PDF xff08 Portable Document Format xff09 是一种便携文档格式 xff0c 便于跨操作系统传播文档 PDF文档遵循标准格式 xff0c 因此存在很多可以操作PD
  • 如何使用ChatGPT API训练自定义知识库AI聊天机器人

    原文 xff1a 如何使用ChatGPT API训练自定义知识库AI聊天机器人 闪电博 在我们之前的文章中 xff0c 我们演示了如何用ChatGPT API建立一个AI聊天机器人 xff0c 并指定一个角色来进行个性化处理 但如果你想在自
  • 哈工大团队开源医学智能问诊大模型 | 华佗: 基于中文医学知识的LLaMa指令微调模型

    原文 xff1a CVHub 门头沟学院AI视觉实验室御用公众号 学术 科研 就业 185篇原创内容 公众号 Title HuaTuo Tuning LLaMA Model with Chinese Medical Knowledge PD
  • 开源数字人Fay

    原文 xff1a 别再因AI焦虑 xff0c 这波年轻人已经用 中国版ChatGPT 创业成功了 数字人 AI 创业 新浪新闻 开源 xff1a GitHub TheRamU Fay Fay是一个完整的开源项目 xff0c 包含Fay控制器
  • 推荐 3 个令你惊艳的 GitHub 项目

    原文 xff1a 推荐 3 个令你惊艳的 GitHub 项目 昨日 GitHub Trending 上榜的开源项目 xff0c 基于 AI 技术提高你的生产力 借助 AI 你能搭建自己的数字人 搭建自己的法律助手 文档分析助手 本期推荐开源
  • AI 数字人制作(方案一):输入一张图片和一段文字即可生成数字人

    方案一 xff1a 原文 xff1a AI 数字人制作 xff08 方案一 xff09 哔哩哔哩 bilibili AI 文字和图片生成数字人 输入一张图片和一段文字即可生成数字人 用三个开源项目整合成可以商用的数字人项目 文本生成语音开源
  • 大量数据情况下单线程插入和多线程insert数据库的性能测试

    大量数据情况下单线程插入和多线程insert数据库的性能测试 之前一直没有遇到过大批量数据入库的场景 xff0c 所以一直没有思考过在大量数据的情况下单线程插入和多线程插入的性能情况 今天在看一个项目源代码的时候发现使用了多线程insert
  • 查看tensorflow 安装目录

    使用命令 xff1a pip show f tensorflow 图和张量源码 xff1a C Program Files Anaconda3 Lib site packages tensorflow python framework op
  • FP-growth算法,fpgrowth算法详解

    FP growth算法 xff0c fpgrowth算法详解 使用FP growth算法来高效发现频繁项集 前言 你用过搜索引擎挥发现这样一个功能 xff1a 输入一个单词或者单词的一部分 xff0c 搜索引擎酒会自动补全查询词项 xff0
  • 如何将一个矩阵化为行阶梯形矩阵

    2016 03 29 尾巴 线性代数 有同学反映上一课过于冷冰冰 xff0c 都是一些不带证明的公式 如果线性代数所有公式都要证明的话 xff0c 线性代数的难度会上好几个量级 xff0c 有的公式的证明是特别特别难的 还有一个 xff0c
  • Activity启动模式与任务栈(Task)全面深入记录(上)

    转载请注明出处 xff08 谢谢 xff09 xff1a http blog csdn net javazejian article details 52071885 任务栈简单入门 最近又把两本进阶书看了一遍 xff0c 但总感觉好记性不
  • VSCode自定义代码片段3——url大全

    url大全 url 39 3 如何自定义用户代码片段 xff1a VSCode 61 左下角设置 61 用户代码片段 61 新建全局代码片段文件 61 自定义片段名称 61 编辑用户片段 61 ctrl 43 S 保存 url大全 34 P
  • mac中如何使用vsode愉快地运行C、C++程序

    闲来无事 xff0c 想在mac中写写C C 43 43 程序 xff0c 打开应用商店 xff0c 准备下个xcode玩玩 xff0c 结果小30G的空间占用直接劝退 因为一直使用vscode开发 xff0c 便萌生了使用插件来运行C C
  • CMake入门3之 静态链接库和动态链接库

    目录 目标 xff1a 环境 创建静态和动态链接库 文件准备 构建 安装静态链接库 使用静态链接库和动态库 使用动态库 使用静态库 目标 xff1a 构建静态链接库和动态链接库 xff0c 安装到系统 xff0c 写一个程序使用安装的静态链