cmake引入三方库
目录结构
.
|-- cmake
| |-- CompilerSettings.cmake
| |-- Options.cmake
| `-- ProjectJsonCpp.cmake
|-- CMakeLists.txt
|-- libdevcore
| |-- CMakeLists.txt
| |-- Foo.cpp
| `-- Foo.h
`-- main
|-- CMakeLists.txt
`-- main.cpp
根目录cmake
# cmake版本要求
cmake_minimum_required(VERSION 3.7)
# 项目信息
project(hello-cmake
VERSION 1.0.0
LANGUAGES CXX)
# 添加模块目录
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
# 基本设置
include(Options)
include(CompilerSettings)
# 下载安装依赖库
include(ProjectJsonCpp)
# 添加子目录
add_subdirectory(libdevcore)
add_subdirectory(main)
cmake目录
- Options.cmake:用于指定编译特性选项,比如是否编译test模块,构建类型等
# 构建类型,支持Debug Release RelWithDebInfo MinSizeRel,默认为Release
if (NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Release" CACHE STRING
"Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE)
endif()
- CompilerSettings.cmake:用于指定编译选项
# 添加根目录到头文件搜索目录
include_directories(BEFORE ${PROJECT_SOURCE_DIR})
# 设置可执行文件输出路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
# 设置编译器选项
if (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
# 各个编译模式下共用的编译选项
set(CMAKE_CXX_FLAGS "-std=c++11 -Wall -Wextra -pthread")
# 各编译模式专有的编译选项
set(CMAKE_CXX_FLAGS_DEBUG "-Og -g")
set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG")
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
else()
message(FATAL "Your compiler is not supported.")
endif()
- ProjectJsonCpp.cmake:引入jsoncpp库
# 导入插件
include(ExternalProject)
include(GNUInstallDirs)
# 设置cmake命令
set(JSONCPP_CMAKE_COMMAND ${CMAKE_COMMAND})
# 下载安装依赖库
ExternalProject_Add(jsoncpp
# 项目根目录
PREFIX ${CMAKE_SOURCE_DIR}/deps
# 下载名
DOWNLOAD_NAME jsoncpp-1.8.4.tar.gz
# 下载链接(支持多源下载)
URL https://github.com/open-source-parsers/jsoncpp/archive/1.8.4.tar.gz
# sha256哈希值校验
URL_HASH SHA256=c49deac9e0933bcb7044f08516861a2d560988540b23de2ac1ad443b219afdb6
# cmake命令
CMAKE_COMMAND ${JSONCPP_CMAKE_COMMAND}
# cmake参数
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
-DJSONCPP_WITH_TESTS=OFF
-DJSONCPP_WITH_PKGCONFIG_SUPPORT=OFF
-DBUILD_SHARED_LIBS=OFF
-DBUILD_STATIC_LIBS=ON
# 日志记录
LOG_CONFIGURE 1
LOG_BUILD 1
LOG_INSTALL 1
# 在后续构建中,跟踪新构建的库
BUILD_BYPRODUCTS <INSTALL_DIR>/${CMAKE_INSTALL_LIBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}jsoncpp${CMAKE_STATIC_LIBRARY_SUFFIX}
)
# 设置jsoncpp的库路径和头文件目录
ExternalProject_Get_Property(jsoncpp INSTALL_DIR)
set(JSONCPP_LIBRARY ${INSTALL_DIR}/${CMAKE_INSTALL_LIBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}jsoncpp${CMAKE_STATIC_LIBRARY_SUFFIX})
set(JSONCPP_INCLUDE_DIR ${INSTALL_DIR}/include)
# 构建逻辑上的目标,方便使用
add_library(JsonCpp STATIC IMPORTED)
file(MAKE_DIRECTORY ${JSONCPP_INCLUDE_DIR}) # Must exist.
set_property(TARGET JsonCpp PROPERTY IMPORTED_LOCATION ${JSONCPP_LIBRARY})
set_property(TARGET JsonCpp PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${JSONCPP_INCLUDE_DIR})
add_dependencies(JsonCpp jsoncpp)
# 取消临时定义
unset(INSTALL_DIR)
libdevcore模块cmake
# 获取源文件和头文件列表
file(GLOB SRCS "*.cpp")
file(GLOB HEADERS "*.h")
# 添加库目标
add_library(devcore STATIC ${SRCS} ${HEADERS})
main模块cmake
# 获取源文件和头文件列表
file(GLOB SRCS "*.cpp")
file(GLOB HEADERS "*.h")
# 添加可执行目标
add_executable(hello-cmake ${SRCS} ${HEADERS})
# 添加依赖库
target_link_libraries(hello-cmake PUBLIC devcore JsonCpp)
cmake引入三方库的更多相关文章
- cmake引入第三方库的debug和release版本之Windows版本
概述 本文将介绍cmak引入第三方库debug和release不同配置. Windows上,习惯将debug模式下生成的动态库名后缀添加D 以作和release区分.cmake创建一个项目A,A引入动 ...
- iOS:iOS开发非常全的三方库、插件等等
iOS开发非常全的三方库.插件等等 github排名:https://github.com/trending, github搜索:https://github.com/search. 此文章转自git ...
- android项目引入三方类库配置文件
android项目中可能会用到诸多外部的三方库,如**.jar或者引用第三个项目,那么它们引用的这些东西都放在哪里呢?我们来看下. 如果引入的是三方的jar包,我们默认的是放在了libs文件夹下,然后 ...
- 如何创建私有pod三方库
1.先登录github或者开源中国码云,创建远程仓库,用来存放库文件代码 仓库创建完成,得到远程仓库地址,并保存备用 2.创建本地代码库 打开终端,cd到你想创建的文件夹下,使用命令:pod lib ...
- iOS - .a静态库的打包(包括打包的文件中用到了一些别人的三方库和分类的处理)
一.概念篇 什么是库? 库是程序代码的集合,是共享程序代码的一种方式 根据源代码的公开情况,库可以分为2种类型 开源库 公开源代码,能看到具体实现 比如SDWebImage.AFNetworking ...
- 网络请求三方库——OkHttp
我们知道在Android开发中是可以直接使用现成的API进行网络请求的,就是使用 HttpClient 和 HttpURLConnention ,而Android 4.4 之后 HttpClient ...
- ld: framework not found AGCommon 关于三方库到入 问题解决方案!!
ld: framework not found AGCommon clang:error:linker command failed with exit code 1 (use -v to see ...
- Android Studio项目引入外部库注意事项(PullToRefresh)
Android Studio开发App项目时引入第三方库是个比较麻烦的事情.之前导入Volley就折腾了好久,导入下拉刷新控件PullToRefresh时又碰到了各种问题.在此记录一下,以便查阅. 一 ...
- 使用python三方库xlrd解析excel数据
excel是平常用的比较多的一种数据格式,而在自动化测试过程中,解析其数据以供脚本使用就是一个重要的工作,幸好已有现存的三方库供使用,而不必重新造轮子. 一.安装xlrd模块 到python官网下载h ...
随机推荐
- Require.js中的路径在IDEA中的最佳实践
本文主要讲述require.js在IDEA中路径智能感知的办法和探索中遇到的问题. 测试使用的目录结构:一种典型的thinkphp 6的目录结构,如下图. 现在我通过在 vue-a.js 中运用不同的 ...
- Flash 0day(CVE-2018-4878)复现过程
一.前言介绍 2018年2月1号,Adobe官方发布安全通报(APSA18-01),声明Adobe Flash 28.0.0.137及其之前的版本,存在高危漏洞(CVE-2018-4878). 从Ad ...
- 初学 React native | 环境搭建(在模拟器上运行)
我的电脑是windows 所以就以 windows上+Android 配置React native 环境 网上的安装教程非常多,我总结了一下,配置环境时出错原因主要是node java python ...
- SpringBoot(20)---断言(Assert)
SpringBoot(20)---断言(Assert) 我们在写单元测试的时候,除了接口直接抛异常而导致该单元测试失败外,还有种是业务上的错误也代表着该单元测试失败.好比我们在测试接口的时候, 该接口 ...
- Java使用ObjectMapper的简单示例
一.什么是ObjectMapper? ObjectMapper类是Jackson库的主要类,它提供一些功能将数据集或对象转换的实现. 它将使用JsonParser和JsonGenerator实例来实现 ...
- Redis基础知识补充及持久化、备份介绍
Redis知识补充 在上一篇博客<Redis基础认识及常用命令使用(一)–技术流ken>中已经介绍了redis的一些基础知识,以及常用命令的使用,本篇博客将补充一些基础知识以及redis持 ...
- k8s运行容器之Job(四)
Job 容器按照持续运行的时间可分为两类:服务类容器和工作类容器. 服务类容器通常持续提供服务,需要一直运行,比如 http server,daemon 等.工作类容器则是一次性任务,比如批处理程序, ...
- redis并发问题2
转自https://mp.weixin.qq.com/s?__biz=MzI1NDQ3MjQxNA==&mid=2247485464&idx=1&sn=8d690fc6f878 ...
- ams入门了解
另一篇介绍文 https://www.cnblogs.com/clds/p/4985893.html 转载自https://www.cnblogs.com/onlysun/p/4533798.htm ...
- 番外篇 - Linux环境准备
这是一个比较早的系列,最近发现一直没有更新... asp.net core跨平台,所以我们首先需要一个linux来验证,所以第一篇就是准备我们的环境 .netcore尝试在centos6. ...