cmake在实际复杂项目中的使用
在实际复杂的项目之中,会有很多的源文件,以及对于库的依赖,如果直接使用makefile会比较的繁琐,而且makefile的推导规则也非常多,对多目录的支持也比较复杂。
最近看了一下cmake,发现配置起来比直接使用makefile要方便很多,学习成本也比较低。
现在假设我们有一个server目录,内部有一个redis目录,就用两个目录来说明问题。
在server目录下,我们创建一个CMakeLists.txt,在redis下也创建一个同样名字的文件,但是内容不同。
由于只昨天晚上学习了一下cmake的使用,粗浅的将实际项目中的makefile替换了,有些不对的地方如果后续发现了,将进行改正
1、首先看下server目录下的CMakeLists.txt
PROJECT(server)
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
INCLUDE_DIRECTORIES("/usr/local/include")
INCLUDE_DIRECTORIES("/usr/include/mysql")
INCLUDE_DIRECTORIES("/usr/include/boost")
INCLUDE_DIRECTORIES("/usr/include/")
ADD_SUBDIRECTORY(redis)
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
MESSAGE(STATUS "dir src:" +${DIR_SRCS})
#ADD_EXECUTABLE(server${DIR_SRCS})
LINK_DIRECTORIES("/usr/local/lib")
LINK_DIRECTORIES("/usr/local/mysql/lib")
LINK_DIRECTORIES("/usr/local/protobuf/lib")
#LINK_DIRECTORIES("/usr/lib/x86_64-linux-gnu/")
ADD_EXECUTABLE(server ${DIR_SRCS})
TARGET_LINK_LIBRARIES(server redis)
TARGET_LINK_LIBRARIES(server net)
TARGET_LINK_LIBRARIES(server log4cplus)
TARGET_LINK_LIBRARIES(server mysqlclient)
TARGET_LINK_LIBRARIES(server boost_system)
TARGET_LINK_LIBRARIES(server boost_thread)
TARGET_LINK_LIBRARIES(server protobuf)
#TARGET_LINK_LIBRARIES(server net)
TARGET_LINK_LIBRARIES(server TinyXml)
需要对使用到的关键字逐一进行一下说明:
(1) PROJECT 指定我们项目的名字,跟最后生成的可执行文件名是可以不一样的,两者没有什么关系
(2) CMAKE_MINIMUM_REQUIRED 指定cmake的版本,我用的环境是Ubuntu14 和 cmake2.8,如果不指定的话,在2.8下会直接提示错误的
(3) INCLUDE_DIRECTORIES 指定项目使用到的头文件目录,可以一次包含多个头文件目录,我为了清晰,每次只包含一个。
(4) ADD_SUBDIRECTORY 这个就是指定我们用到的子目录,在这里就是redis
(5) AUX_SOURCE_DIRECTORY 这个是指定我们server目录下需要用到的所有问题,这里使用一个"."当前目录符号替代就可以了,但是在子目录下如果这么这么使用就会报错,目前还不太清楚为什么。
(6) MESSAGE 属于提示信息,方便查看的,可有可无
(7) LINK_DIRECTORIES 指定程序需要链接的库目录
(8) ADD_EXECUTABLE 指定我们程序最后可执行文件的名字
(9) TARGET_LINK_LIBRARIES 最后是链接时候用到的库文件名字,跟INCLUDE_DIRECTORIES,也可以一次写多个,这里需要特别注意的是,其中net库是自己编写的,其中用到了boost_thread库,如果将net库写在boost_thread库后面的话,在链接的时候,会提示找不到boost_thread库,一定要写在net库依赖库的前面
具体的每个关键字的用法,可以网上找下cmake的手册看下
2、我们看下redis子目录下的CMakeLists.txt写法
#AUX_SOURCE_DIRECTORY(. DIR_REDIS_SRCS)
SET(DIR_REDIS_SRCS
anet.cpp
)
MESSAGE(STATUS ${DIR_REDIS_SRCS})
ADD_LIBRARY (redis ${DIR_REDIS_SRCS})
注意将redis子目录编译成了一个lib库,然后跟server目录下进行连接了
3、然后就是开始使用cmake进行编译了,在server目录下使用“cmake .” 命令进行预生成,cmake会检查语法以及编译环境,如果没问题,就可以使用make指令进行实际的编译操作了
cmake在实际复杂项目中的使用的更多相关文章
- 直接在CMake项目中编译GoogleTest和GoogleMock作为项目的一部分
直接在CMake项目中编译GoogleTest和GoogleMock作为项目的一部分 本文是关于如何将GoogleTest和GoogleMock在没有预先编译安装在机器的情况下,直接在项目中作为项目的 ...
- [转]C,C++开源项目中的100个Bugs
[转]C,C++开源项目中的100个Bugs http://tonybai.com/2013/04/10/100-bugs-in-c-cpp-opensource-projects/ 俄罗斯OOO P ...
- TFS在项目中DevOps落地进程(下)
紧接上篇 TFS在项目中Devops落地进程(上) 再接着说TFS相关之前先插入一个番外篇,虽然跟TFS关系不大但跟DevOps关系很大,觉得有必要在此乱入一下. 番外篇--监控之Applicatio ...
- <<Modern CMake>> 翻译 2.4 项目目录结构
<<Modern CMake>> 翻译 2.4 项目目录结构 本节内容有点跑题.但我认为这是一个很好的方法. 我将告诉你如何规划项目的目录. 这是基于惯例,但将帮助您: 轻松阅 ...
- 在自己的项目中使用PCL
在自己的项目中使用PCL项目设置:1.创建cpp文件,如pcd_write.cpp,文件内容如下例: #include <iostream>#include <pcl/io/pcd_ ...
- cmake之引入外部项目(引用其他项目)、FetchContent管理子模块(fetchcontent用法)
本文CMAKE版本为3.18 演示环境: Windows+CMake+VS2017 源码下载说明 演示代码是后来传上去的,而且做了些修改,将spdlog_demo由exe改为了lib,但是,spdlo ...
- VS项目中使用Nuget还原包后编译生产还一直报错?
Nuget官网下载Nuget项目包的命令地址:https://www.nuget.org/packages 今天就遇到一个比较奇葩的问题,折腾了很久终于搞定了: 问题是这样的:我的解决方案原本是好好的 ...
- ABP项目中使用Swagger生成动态WebAPI
本文是根据角落的白板报的<使用ABP实现SwaggerUI,生成动态webapi>一文的学习总结,感谢原文作者角落的白板报. 1 安装Swashbuckle.core 1.1 选择WebA ...
- iOS 之项目中遇到的问题总结
昨天去一家公司面试,面试官问了我在项目开发中遇到过哪些问题,是什么引起的,怎样解决的? 当时由于有点小紧张只说出了一两点,现在就来好好总结一下. 问题: 1.两表联动 所谓的两表联动就是有左右两个表格 ...
随机推荐
- sql server还原数据库文件(.bak)常见问题解决办法笔记
还原的时候出现错误:备份集中的数据库备份与现有的数据库不同 SQL Server 2005数据库还原出错错误具体信息为:备份集中的数据库备份与现有的A数据库不同 具体操作如下:第一次:新建了数据库A, ...
- Jsp页面中使用fckeditor控件的两种方法 [转]
fckeditor控件请到官方网站下载http://www.fckeditor.net,本例主要用到FCKeditor_2.6.3.zip.fckeditor-java-demo-2.4.1.zip. ...
- 和小猪一起搞微信公众号开发—获取Access_token
前言 前一篇小猪和大家分享了如何回复用户的简单文本,这一篇我们来看看如何获取Access_token 介绍 在前一篇中,我们实现了这么一个简单的过程:用户发送一个文本到公众号后,公众号在该文本后面加上 ...
- PULL解析
PULL解析类似于SAX解析,都采用事件驱动(利用getEventType()方法)方式进行解析,当PULL解析器开始解析之后,可以不断地调用PULL解析器的next()方法获取下一个解析事件(开始文 ...
- VS2010连接SQLite数据库
Visual studio 2010及以上版本,连接SQLite数据库 1.在Sqlite开发站点下载SQLite的.exe安装包 Ctrl+F搜索这条语句:This is the only setu ...
- php 获取当前url,可以规避框架url重写后还有index.php的情况
function get_url(){ $pageURL = 'http'; if ($_SERVER["HTTPS"] == "on") { $pageURL ...
- jquery表单提交和重置
$('#myform').submit() 表单提交 $('#myform')[0].reset() 表单重置
- [开发笔记]-使用bat命令来快速安装和卸载Service服务
一般我们在编写完Service服务程序后,都是通过cmd命令提示窗口来安装或卸载服务,但频繁的在cmd窗口中去“拼”文件的路径着实让人“不能忍”.所以,我们需要一钟“更快捷”的方式来进行安装或者卸载操 ...
- [转]centos7 配置yum源(本地+光盘)
from:http://wangyan.org/blog/setup-local-yum-repo.html 一,本地 1.创建本地yum仓库 1.mkdir -p /yum/local #可以有N级 ...
- [转] Linux内核代码风格 CodingStyle [CH]
from:http://blog.csdn.net/jiang_dlut/article/details/8163731 中文版维护者: 张乐 Zhang Le <r0bertz@gentoo. ...