简介:
在WINDOWS系统中有很多的动态链接库(以.DLL为后缀的文件,DLL即Dynamic Link Library)。这种动态链接库,和静态函数库不同,它里面的函数并不是执行程序本身的一部分,而是根据执行程序需要按需装入,同时其执行代码可在多个执行程序间共享,节省了空间,提高了效率,具备很高的灵活性,得到越来越多程序员和用户的青睐。
在LINUX系统中有无这样的函数库呢? 答案是肯定的,LINUX的动态链接库不仅有,而且为数不少。在/lib目录下,就有许多以.so作后缀的文件,这就是LINUX系统应用的动态链接库,只不过与WINDOWS叫法不同,它叫so,即Shared Object,共享对象。
综上所述使用 .DLL或者.so的优点如下:
1. 函数不是程序本身的一部分,而是根据执行程序按需装入
2. 执行代码在多个执行程序间共享,节省空间,提升效率,灵活性很高
多个源代码生成单个.so文件
方式1:使用add_library(<库名字> <*.c *.cpp> <*.h *.hpp>)就可以解决
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)
方式2 :使用gcc指令,代码文件简短时候很方便,不然还是采用Cmake
gcc -fpic -shared -o example.so example1.c example2.c-fpic 使输出的对象模块是按照可重定位地址方式生成的。
3. xxx.so文件的使用和测试
关于使用:
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})
可以看到此时生成的文件如下,为了演示,下面这个前缀后缀会怪异一点;看到这些软链接什么的应该很熟悉