[CMake教程](四)CMake 配置生成lib或者so的库文件
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201107151539857.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xvbmcxMjM0NDQ=,size_16,color_FFFFFF,t_70#pic_center)
(1)系列教程介绍
上面几个教程我们的程序都是生成可执行文件。但是我们在合作开发算法的时候经常需要交付的是一个模块,该模块提供特定的算法功能,用于给整体的项目进行调用。但我们又不能直接提供源码,所以我们可以提供一个库文件(静态库或者动态库),配置接口文件可以在不提供源代码的情况下给他人提供算法模块功能。本文主要讲述如何使用CMakeLists.txt,配置生成动态和静态库文件。
(2)CMake 的使用环境和安装
本教程的使用环境为:
ubutu18.04 lts
gcc version 7.5.0
g++ version 7.5.0
cmake version 3.10.2
安装cmake:
sudo apt install cmake
(3)设置设置我们的程序输出为lib文件
配置输出库文件(lib和so)主要是通过函数add_subdirectory进行配置,使用STATIC表示静态库(lib),SHARED表示动态库(so)。同时可以使用SET_TARGET_PROPERTIES函数可以设置库文件的版本。
首先,看一下整体的目录结构:
|-- tutorial_fourth/
|-- src/
|-- tutorial.cpp
|-- include/
|--TutorialConfig.h.in
|-- mathlib/
|-- CMakeLists.txt
|-- mathlib.h
|-- mathlib.cpp
|-- CMakeLists.txt
根目录下的CMakeLists.txt文件为:
cmake_minimum_required(VERSION 3.10)
project(tutorial VERSION 1.0)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD 11)
option(USE_MYMATH "Use tutorial provided math implementation" ON)
configure_file(include/TutorialConfig.h.in TutorialConfig.h)
if(USE_MYMATH)
add_subdirectory(mathlib)
list(APPEND EXTRA_LIBS mathlib)
list(APPEND EXTRA_INCLUDES "${PROJECT_SOURCE_DIR}/mathlib")
endif()
add_executable(tutorial src/tutorial.cpp)
target_link_libraries(tutorial PUBLIC ${EXTRA_LIBS})
target_include_directories(tutorial PUBLIC
"${PROJECT_BINARY_DIR}"
${EXTRA_INCLUDES}
)
mathlib路径下CMakeLists.txt文件为:
SET_TARGET_PROPERTIES(mathlib PROPERTIES VERSION 1.2 SOVERSION 1)
add_library(mathlib mathlib.cpp)
为了将cmake中的变量自动传递到程序中,在TutorialConfig.h.in中添加#cmakedefine USE_MYMATH命令用于在cmake中生成USE_MYMATH宏定义。
TutorialConfig.h.in中代码为:
// the configured options and settings for Tutorial
#define Tutorial_VERSION_MAJOR @tutorial_second_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @tutorial_second_VERSION_MINOR@
#cmakedefine USE_MYMATH
在程序tutorial.cpp中添加处理命令:在cmake中定义USE_MYMATH的时候在程序中才会编译该命令块。具体请看CMakeDemo4代码。
#ifdef USE_MYMATH
# include "MathFunctions.h"
#endif
命令使用:
set_target_properties:设置目标的属性值
set_target_properties(target1 target2 ...
PROPERTIES prop1 value1
prop2 value2 ...)
add_library: 为生成的库添加源文件,是库的名字,直接写名字即可,不要写lib,会自动加上前缀。 STATIC表示静态库(lib),SHARED表示动态库(so)。
add_library(<name> [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
source1 [source2 ...])
option: 提供一个选项是OFF或者ON,如果没有初始值被提供则默认使用OFF。
option(<option_variable> "help string describing option"
[initial value])
add_subdirectory: 添加一个编译的子路径,在子路径中查找CMakeLists.txt文件,并进行编译。
add_subdirectory(source_dir [binary_dir]
[EXCLUDE_FROM_ALL])
list:对项目中的所有值构建一个list,然后对变量进行操作。
list(LENGTH <list> <output variable>)
list(GET <list> <element index> [<element index> ...]
<output variable>)
list(APPEND <list> [<element> ...])
list(FILTER <list> <INCLUDE|EXCLUDE> REGEX <regular_expression>)
list(FIND <list> <value> <output variable>)
list(INSERT <list> <element_index> <element> [<element> ...])
list(REMOVE_ITEM <list> <value> [<value> ...])
list(REMOVE_AT <list> <index> [<index> ...])
list(REMOVE_DUPLICATES <list>)
list(REVERSE <list>)
list(SORT <list>)
target_link_libraries:对目标进行链接操作,如果有需要链接的库文件的时候才进行操作,如果该项目没有库文件,则不需要该命令。该命令一般在add_executable后面。
target_link_libraries(<target> ... <item>... ...)
(4)使用CMake进行编译
CMake在生成文件的过程中会生成很多中间缓存文件,为了使项目更简洁,文件路径更清楚,一般会在项目的root目录下建立一个文件夹,用于存储CMake生成的中间文件。而一般使用的文件家名称为build或者release。下面是使用命令:
cd tutorial_first
mkdir build
cmake ..
cmake --build .
实时分享CVPR、ECCV等会议,关注深度学习、自动驾驶领域,我们期待你的加入。点击上方“CNNer”,选择加“星标”或“置顶”精选干货,当日达。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201107152355671.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xvbmcxMjM0NDQ=,size_16,color_FFFFFF,t_70#pic_center)
长按加微信▲
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201107152500193.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xvbmcxMjM0NDQ=,size_16,color_FFFFFF,t_70#pic_center)
长按关注▲
备注:研究方向+地点+学校/公司+昵称,更快通过申请,长按加细分领域技术交流群,目前有细分领域:图像分割、图像目标检测、论文写作、车道检测、模型优化、目标跟踪、SLAM、点云处理(分割检测)、深度学习。
PS:腾讯最近更改公众号推送规则,文章推送不在按照时间排序,而是通过智能推荐算法有选择的推送文章,为了避免收不到文章,看完文章您可以点击一下右下角的"在看",以后发文章就会第一时间推送到你面前。
获取完整工程代码,公众号回复:CMakeDemo3
声明:文章来自于网络,仅用于学习分享,版权归原作者所有,侵权请加上文微信联系删除。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)