最近需要写一个linux环境下使用的相机SDK。需要利用C语言写一个可以被C/C++调用的动态链接库。
那么如何书写一个动态链接库呢?
为了后面的扩展性,打算使用Cmake工具生成makefile。先建立一下简单的工程,获取SDK的版本信息。
1、环境准备
检测系统是否含有cmake工具
cmake --version如果出现版本信息,那么就是已经存在cmake工具了。
如果没有,那么使用下面的命令进行安装
sudo apt install cmake2、编写生成动态连接库的测试工程

文件结构如上图。
文件夹build用来存放cmake执行产生的文件和make执行时候产生的文件
文件夹include用来存放头文件
文件夹lib用来存放生成的动态链接库
文件夹src用来存放源代码
下面查看一下CmakeLists.txt的内容:
cmake_minimum_required (VERSION 2.6) #指定执行cmake的最低版本
project(camera_sdk) #指定工程名
include_directories("include") #指定包含路径
aux_source_directory("${PROJECT_SOURCE_DIR}/src" SRC)#加载源代码
add_library(camera_sdk SHARED ${SRC}) #生成动态链接库
set (LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)#设置动态连接库的输出路径其中与生成动态路径重要关系的是:add_library(camera_sdk SHARED ${SRC})。
这里的第一个参数 camera_sdk指定名称, 第二个参数SHARED指定的是库的类型这里指的是动态连接库,如果是STATIC那就是静态库,第三个参数是源文件路径。
之后进入到build目录下,执行cmake ..
之后就可以在build文件夹中看到Makeifle文件。
之后再执行,make命令就会在lib文件中生成使用的动态链接库。

上图是执行cmake ..和make之后的文件结构。
3、使用动态链接库

上图为测试工程的文件结构。
build文件夹用来存放cmake产生的而文件和make产生的文件。
include用来存放包含文件,其中把生成动态链接库的头文件复制到这个文件夹里面。
lib用来存放使用到的库文件,将上面生成的动态链接库复制到这个文件夹中。
src文件夹用来存放源代码。
下面分析CMakeLists.txt
cmake_minimum_required (VERSION 2.6)
project(camera_sdk_test)
include_directories("include")
aux_source_directory("${PROJECT_SOURCE_DIR}/src" SRC)
ADD_EXECUTABLE(camera_sdk_test ${SRC})
TARGET_LINK_LIBRARIES(camera_sdk_test "${PROJECT_SOURCE_DIR}/lib/libcamera_sdk.so")其中与使用动态链接库有关的语句就是:TARGET_LINK_LIBRARIES(camera_sdk_test "${PROJECT_SOURCE_DIR}/lib/libcamera_sdk.so"),通过这句话来链接到所要使用的库。
进入到build文件夹下,执行cmake ..和make后可以看到camera_sdk_test 可执行文件,执行camera_sdk_test :
![]()
测试成功。
小结:这只是一个简单的小例子。后面如果结构发生变化也要重新设计一下Cmake的文件。其中有一个地方就是${PROJECT_SOURCE_DIR}这指示的路径就是project所在的位置,使用和这个位置来进行相对路径的使用(cmake使用的其实都是绝对路径)。就是一些浅显的理解与使用,如有错误希望得到订正。谢谢。