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 ...
随机推荐
- C#通过Com串口进行Barcode Printer
前言 工作中有遇到Barcode打印的需求,最开始是通过打印机型号找到对应的打印机,再进行操作,但是需要匹配的打印机型号太多,而且不定,所以处理起来太过麻烦. 后面通过找到通过串口找到打印机,直接传输 ...
- JavaScript函数及面向对象
函数及面向对象 目录 函数及面向对象 1. 定义函数 1. 定义方式一 2. 定义方式二 2. 调用函数 1. 参数问题 2. arguments 3. rest 3. 变量的作用域 1 . var的 ...
- ui自动化---CssSelector
xpath切换到css
- linux定时删除过期文件
需求说明 每日凌晨0点定时删除/temp目录下的所有一个月未被访问的文件. 脚本实现 linux 终端输入crontab -e,添加定时任务脚本命令 [root@localhost ~]# cront ...
- Java新特性:数据类型可以扔掉了?
在很久很久以前,我们写代码时要慎重的考虑变量的数据类型,比如下面这些: 枚举:尽管在 JDK 5 中增加了枚举类型,但是 Class 文件常量池的 CONSTANT_Class_info 类型常量并没 ...
- Python列出指定目录下的子目录/文件或者递归列出
1.python只列出当前目录(或者指定目录)下的文件或者目录条目 import os files,dirs=[],[] for item in os.listdir(): if os.path.is ...
- 八皇后问题(n-皇后问题)
JAVA 作为一道经典的题目,那必然要用经典的dfs来做 dfs:深度优先搜索----纵向搜索符合条件的内容,走到底时回到上一个路口再走到底再回去,套娃至结束. 条件:在一个n*n的国际棋盘上摆放n个 ...
- DeRPnStiNK靶机渗透
DeRPnStiNK靶机渗透 常规的信息搜集 扫到了phpmyadmin以及wordpress并在后台发现弱密码,即admin,admin 这里对wordpress进行了扫描: 扫描插件: searc ...
- Java程序员面试学习资料汇总
整理了一些关于Java程序员面试的书籍及免费资料. 一.书籍篇1)<Offer来了:Java面试核心知识点精讲(原理篇)>精讲Java面试必需的JVM原理.Java基础.并发编程.数据结构 ...
- 程序员的开源月刊:HelloGitHub(第 54 期)
兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程.对开源社区感兴趣 人群的月刊,月刊的内容包括:各种编 ...