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

【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)

发布了100 篇原创文章 · 获赞 64 · 访问量 25万+

猜你喜欢

转载自blog.csdn.net/hl_java/article/details/91038551