linux环境下利用Cmake生成动态链接库并使用实例

最近需要写一个linux环境下使用的相机SDK。需要利用C语言写一个可以被C/C++调用的动态链接库。

那么如何书写一个动态链接库呢?

为了后面的扩展性,打算使用Cmake工具生成makefile。先建立一下简单的工程,获取SDK的版本信息。

1、环境准备

检测系统是否含有cmake工具

cmake --version

如果出现版本信息,那么就是已经存在cmake工具了。

如果没有,那么使用下面的命令进行安装

sudo apt install cmake

2、编写生成动态连接库的测试工程

文件结构如上图。

文件夹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使用的其实都是绝对路径)。就是一些浅显的理解与使用,如有错误希望得到订正。谢谢。


版权声明:本文为qq_32497777原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。