简介:

在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})

可以看到此时生成的文件如下,为了演示,下面这个前缀后缀会怪异一点;看到这些软链接什么的应该很熟悉