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