【C++从入门到放弃】C++编译生成动态链接库*.so及如何调用*.so进阶篇2-编译jsoncpp

2023-10-29

【C++从入门到放弃】C++编译生成动态链接库*.so及如何调用*.so进阶篇2-编译jsoncpp

附:当前项目cstudy7

本文可以收获什么?

  • 将其它项目生成的动态链接库拿到本项目中使用
  • CMakeLists.txt中使用其它项目的动态链接库
  • Mac OS X下的ldd工具——otool使用姿势

cstudy5中,我们演示了自己的写的源码进行编译成链接库,本章将讲解编译开源的jsoncpp
cstudy6中,我们演示编译开源的cppjson,并直接在那个项目中创建测试用例由于当前项目中含有jsoncpp的源文件,所以特将编译后的libjsoncpp2.so与头文件复制到一个新项目中进一步验证下

准备工作

目录结构如下:

 tree
.
├── CMakeLists.txt
├── ReadMe.md
├── include
│   └── json
│       ├── allocator.h
│       ├── assertions.h
│       ├── autolink.h
│       ├── config.h
│       ├── features.h
│       ├── forwards.h
│       ├── json.h
│       ├── reader.h
│       ├── value.h
│       ├── version.h
│       └── writer.h
└── src
    ├── libjsoncpp2.so
    └── mainA.cpp

g++方式编译及运行

编译可执行程序

cd src
g++ --std=c++11 mainA.cpp -L. -ljsoncpp2

发现可以正常运行

./a.out
llll:{"uploadid": "LZC000999","code": 100000,"msg": "","files": ""}
code:::::100000
uploadid:::::LZC000999

不过要求当前目录必须有libjsoncpp2.so才能运行,否则会报错误,也就是除了编译会用到之外,运行期也还是需要这个动态链接库文件的

 rm -rf libjsoncpp2.so
 ./a.out
dyld: Library not loaded: libjsoncpp2.so
  Referenced from: /Users/mac/work/gitstudy/cstudy7/src/./a.out
  Reason: image not found
Abort trap: 6

CMakeLists.txt方式编译及运行

CMakeLists.txt文件具体内容

#1.cmake verson,指定cmake版本
cmake_minimum_required(VERSION 3.13)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

#2.project name,指定项目的名称,一般和项目的文件夹名称对应
PROJECT(cstudy7)

#3.head file path,头文件目录
INCLUDE_DIRECTORIES(include)
LINK_DIRECTORIES(src)

#4.source directory,源文件目录
AUX_SOURCE_DIRECTORY(src DIR_SRCS)

message(STATUS "LZC测试下自定义的status提示内容")

#5.set environment variable,设置环境变量,编译用到的源文件全部都要放到这里,否则编译能够通过,但是执行的时候会出现各种问题,比如"symbol lookup error xxxxx , undefined symbol"
#SET(TEST_MATH ${DIR_SRCS})

#6.add executable file,添加要编译的可执行文件
ADD_EXECUTABLE(${PROJECT_NAME} ${DIR_SRCS})

#7.add link library,添加可执行文件所需要的库,比如我们用到了libm.so(命名规则:lib+name+.so),就添加该库的名称
#查找的目录来自于上面的配置参数LINK_DIRECTORIES(src)
TARGET_LINK_LIBRARIES(${PROJECT_NAME} jsoncpp2)

由于cmake之后的文件比较多,一般建议新建一个文件夹再执行

mkdir build
cd build
cmake ..
make

运行程序

 ./cstudy7
dyld: Library not loaded: libjsoncpp2.so
  Referenced from: /Users/mac/work/gitstudy/cstudy7/build/./cstudy7
  Reason: image not found
Abort trap: 6

cp ../src/libjsoncpp2.so .

 ./cstudy7
llll:{"uploadid": "LZC000999","code": 100000,"msg": "","files": ""}
code:::::100000
uploadid:::::LZC000999

直接运行是会报错的,需要将链接库文件copy到当前目录再运行就OK了

Mac OS X下的ldd工具——otool

参考文章
https://blog.csdn.net/delphiwcdj/article/details/25541397

otool -L cstudy7
cstudy7:
        libjsoncpp2.so (compatibility version 0.0.0, current version 0.0.0)
        /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 400.9.4)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.250.1)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C++从入门到放弃】C++编译生成动态链接库*.so及如何调用*.so进阶篇2-编译jsoncpp 的相关文章

随机推荐

  • CSS 类选择器的特殊使用-多类名

    title CSS 类选择器的特殊使用 多类名 CSS 类选择器的特殊使用 多类名概念 一个标签有多个名字 多类名的使用方式 示例代码
  • 在NW.js里面使用node-printer

    0 写在前面的一些提示 不要使用太高版本的 NW js 以及 Node js 因为 node printer 会有兼容性问题 目前笔者测试到 node printer 最高只能在 0 43 x 版本以及低于这个版本的 NW js 里面正常运
  • 代码走查与代码审查区别

    代码走查 程序员和测试员组成审查小组 通过逻辑运行程序 第一步 小组成员提前阅读设计规格书 程序文本等相关文档 第二步 利用测试用例 使程序逻辑运行 记录程序的踪迹 发现 讨论 解决问题 代码审查 程序员和测试员组成审查小组 第一步 小组成
  • robot通过一个元素定位另一个元素

    xpath定位 xpath span text 文章评为精华 div div span text 去完成
  • 一些keil编程错误总结

    一 error c267 delay 10us requires ANSI style prototype问题 解决方法 1 未进行 模块化程序设计时 delay 10us该子函数要在主函数前 2 在进行 模块化程序设计时 这是由于 c文件
  • 区块链在非金融领域有哪些值得期待的应用

    引言 自己关注区块链好多年了 感觉大部分人都在炒币 或者所谓的搞金融 但是现在各国的审查都越来越严格 针对金融领域的审查尤其严格 在国内 基本上是禁止区块链应用有任何的发币行为的 我个人也是觉得金融领域的监管太多 反而不容易落地 这篇文章来
  • Redis中的String类型与List类型个人理解

    String类型 String类型是Redis的最基础类型 最大能存储512MB 其中存储值可以是最简单的字符串 复杂的 xml json的字符串 二进制图像或者音频的字符串 以及是数字的字符串 String数据类型与结构 基本操作 set
  • R语言的plyr包简介

    转载地址 http www jianshu com p bfddfe29aa39 R语言的plyr包简介 字数3040 阅读2875 评论3 喜欢7 R语言中的类SQL操作 plyr包可以进行类似于数据透视表的操作 将数据分割成更小的数据
  • Eclipse启动tomcat出现invalid ports的解决办法

    在Eclipse出现以上错误的 可以继续往下看 在server中 点击Tomcat 进入设置 把三个端口都填写了不留空 根据情况来填写相应的端口号 防止占用 保存即可
  • 交易流水指标统计——pandas

    1 根据交易流水 计算每个交易交易对象的如下指标 总收入笔数 总收入月数 最大月收入笔数 最大月收入笔数所在日期 年月日格式 import pandas as pd path r C Users xxx Desktop 科技数据 xlsx
  • Angular入门学习笔记

    Angualr入门扫盲必备 声明 这篇是我学习angualr的笔记 可以转载 但必须注明来源作者 kone 并附上本文链接 A 环境 工具 1 先确保安装了nodejs和npm Nodejs npm 包管理器 cnpm 淘宝的镜像 2 安裝
  • 低代码让开发变得不再复杂

    传统IT自研软件开发 通过编程去写代码 还有数据库 API 第三方基础架构等 从而造成开发周期长 难度大 技术人员不易于开发维护 因此价格及时间成本也是相对较高 后期出现了可以直接应用的成品软件 以及现在火热的低代码开发方式 针对这三种方式
  • 给Sqlite数据库设置密码

    免费版Sqlie是不提供设置密码功能的 经过查阅资料最终找到了解决方案 方案一 从sqlite源码入手 据说sqlite源码已经提供了加密的接口 只是免费版没有实现 可以参考这位仁兄的博客以了解详情 http www cnblogs com
  • 架构师是做什么的?

    哈佛大学有一个非常著名的关于目标对人生影响的跟踪调查 调查的对象是一群智力 学历 环境等条件都差不多的大学毕业生 结果是这样的 第一类人 27 的人 没有目标 第二类人 60 的人 目标模糊 第三类人 10 的人 有清晰但比较短期的目标 第
  • Mysql错误1452 - Cannot add or update a child row: a foreign key constraint fails 原因及解决方法

    报错的原因大概分为三种 原因一 添加的外键列与另一个表的唯一索引列 一般是主键 的数据类型不同 原因二 要添加外键的表类型与另一个表的存储引擎是不是都为innodb引擎 查看表引擎 法一 show create table 表名 法二 sh
  • ag-grid在Vue项目中的基本使用

    ag grid官网 1 安装 npm install ag grid community ag grid vue save dev 2 在main js中引入ag grid的样式文件 引入ag grid的样式文件 import node m
  • bing搜索引擎入口_资源搜索,除了百度,还有哪些好用的搜索引擎?

    作者 杨银洁 来源 ETPPT 遇到问题怎么办 百度一下 你out了 除了百度还有很多搜索引擎 而且还有很多国外网站可以检索哦 是否还在苦恼高清图找不到 PPT素材找不到 关注ETPPT这些就不是问题 今天我们就介绍一下有哪些可以轻松帮助你
  • 云原生之使用Docker部署BookBrowser电子书浏览器

    云原生之使用Docker部署BookBrowser电子书浏览器 一 BookBrowser简介 1 BookBrowser简介 2 BookBrowser特点 二 检查docker环境 1 检查docker状态 2 检查docker版本 3
  • Java线程和操作系统线程的关系

    传统进程的缺点 fork一个子进程的消耗是很大的 fork是一个昂贵的系统调用 即使使用现代的写时复制 copy on write 技术 各个进程拥有自己独立的地址空间 进程间的协作需要复杂的IPC技术 如消息传递和共享内存等 多线程的优缺
  • 【C++从入门到放弃】C++编译生成动态链接库*.so及如何调用*.so进阶篇2-编译jsoncpp

    C 从入门到放弃 C 编译生成动态链接库 so及如何调用 so进阶篇2 编译jsoncpp 附 当前项目cstudy7 本文可以收获什么 将其它项目生成的动态链接库拿到本项目中使用 CMakeLists txt中使用其它项目的动态链接库 M