Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说.so文件的生成和使用[通俗易懂],希望能够帮助你!!!。
简介:
在WINDOWS系统中有很多的动态链接库(以.DLL为后缀的文件,DLL即Dynamic Link Library)。这种动态链接库,和静态函数库不同,它里面的函数并不是执行程序本身的一部分,而是根据执行程序需要按需装入,同时其执行代码可在多个执行程序间共享,节省了空间,提高了效率,具备很高的灵活性,得到越来越多程序员和用户的青睐。
在LINUX系统中有无这样的函数库呢? 答案是肯定的,LINUX的动态链接库不仅有,而且为数不少。在/lib目录下,就有许多以.so作后缀的文件,这就是LINUX系统应用的动态链接库,只不过与WINDOWS叫法不同,它叫so,即Shared Object,共享对象。
综上所述使用 .DLL或者.so的优点如下:
1. 函数不是程序本身的一部分,而是根据执行程序按需装入
2. 执行代码在多个执行程序间共享,节省空间,提升效率,灵活性很高
add_library(ImageDealFunction SHARED lsd.c IO.cpp LineMatching.cpp MatOperation.cpp PartiallyRecoverConnectivity.cpp camera.cpp ImageDealFunction.cpp lsd.h IO.h LineMatching.h MatOperation.h PartiallyRecoverConnectivity.h camera.h ImageDealFunction.h )
add_executable(TestDeal main.cpp)
gcc -fpic -shared -o example.so example1.c example2.c-fpic 使输出的对象模块是按照可重定位地址方式生成的。
关于使用:
Linux下使用动态链接库,源程序需要包含xxx.h头文件,此文件定义了调用动态链接库的函数的原型。下面详细说明一下这些函数。
关于安装:
filename: so文件名.如果名字不以/开头,则非绝对路径名,将按下列先后顺序查找该文件。
方式1: 放入Linux系统的 /usr/lib中就好
方式2:源码编译的lib一般在usr/local/lib中
方式3:目录/lib
方式4:用户环境变量中的LD_LIBRARY值;
方式5: 动态链接缓冲文件/etc/ld.so.cache
关于测试:
测试.so文件是否合格待补充
废话不多说,上 CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(FooLibrary VERSION 1.0.0)
set(CMAKE_CXX_STANDARD 11)
add_library(${PROJECT_NAME} SHARED library.cpp library.h)
是的,就是这么简单
add_library 语法
add_library(<name> [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
source1 [source2 ...])
<name> 指定生成的库文件名称,会自动加上前缀和后缀
STATIC 生成静态库
SHARED 生成动态链接库
MODULE 这个生成的库注重于动态加载,而不是编译链接(官网说的),但是我实测和 SHARED 没什么区别
然后后面就是源码列表了哈
可以用 set_target_properties 设置一些东西,语法如下
set_target_properties(target1 target2 ...
PROPERTIES prop1 value1
prop2 value2 ...)
例举几个常用的 property
OUTPUT_NAME 这个可以改生成文件的名称
PREFIX 指定前缀
SUFFIX 指定后缀
VERSION 指定动态库版本
SOVERSION 指定 API 版本
设置上述变量的 CMakeLists.txt 如下
cmake_minimum_required(VERSION 3.16)
project(FooLibrary VERSION 1.0.0)
set(CMAKE_CXX_STANDARD 11)
add_library(${PROJECT_NAME} SHARED library.cpp library.h)
set_target_properties(${PROJECT_NAME} PROPERTIES
OUTPUT_NAME Foo
PREFIX Lib
SUFFIX .SO
VERSION ${CMAKE_PROJECT_VERSION}
SOVERSION ${CMAKE_PROJECT_VERSION_MAJOR})
可以看到此时生成的文件如下,为了演示,下面这个前缀后缀会怪异一点;看到这些软链接什么的应该很熟悉
上一篇
已是最后文章
下一篇
已是最新文章