CMake入门(二)

最后更新日期:2014-04-25 by kagula

阅读前提:《CMake入门(一)》、Linux的基本操作

环境: Windows 8.1 64bit英文版。Visual Studio 203 Update1英文版。CMake 2.8.12.2、 Cent OS 6.5。

内容简单介绍

介绍在VisualStudio上现有的项目怎样移植到Linux上。本文通过列出两个最简单、也是最经常使用的样例来介绍Linux下CMake的使用。

CentOS 上安装CMake 2.8.12.2

尽管在Cent OS 上直接能够使用“yuminstall cmake”命令来安装。可是版本号太低,我们须要在www.cmake.org上直接下载最新的CMake源码来安装

从官网下载cmake-2.8.12.2.tar.gz到“/usr/local”路径下。输入“tar -zxvf cmake-2.8.12.2.tar.gz”命令在当前位置解压缩,如今“/usr/local”路径下新建了“cmake-2.8.12.2”文件夹,进入文件夹。

安装C语言和C++语言编译器

#yum install gcc  gcc-c++  

配置

#./configure

编译与链接

#make

安装

#make install

CMake会把程序安装到/local/host/bin下

执行以下的命令查看CMake的当前版本号,能够看到已经是2.8版本号了。

#cmake --version

在Linux上使用CMake的第一个样例

在VisualStudio上新建项目CMake_Tutorial2,详细过程例如以下 [Visual Studio]->[Visual C++]->[Win32]->[Win32 Project]打开向导窗体,选择[Applicationtype]为console application,选择[Additional options]为Empty project后[Finish]。

新建Source.cpp源文件清单例如以下:

#include <stdio.h>extern void HelloWorld();int main(int args, wchar_t* argv[])
{HelloWorld();getchar();return 0;
}

新建MyLib.cpp源文件清单例如以下:

#include <iostream>using namespace std;void HelloWorld()
{
#ifdef WIN32wcout << L"Hello,World From Windows!" << endl;
#elsewcout << L"Hello,World From Cent OS!" << endl;
#endif
}

加入CMakeLists.txt文件,源文件内容例如以下:

#设置项目名称
project(CMake_Tutorial2)#要求CMake的最低版本号为2.8
cmake_minimum_required(VERSION 2.8)#用于将当前文件夹下的全部源文件的名字保存在变量 DIR_SRCS 中
aux_source_directory(. DIR_SRCS)#用于指定从一组源文件 source1 source2 … sourceN(在变量DIR_SRCS中定义)
#编译出一个可运行文件且命名为CMake_Tutorial1
add_executable(CMake_Tutorial2 ${DIR_SRCS})

这次须要的三个文件都齐备了。Source.cpp是我们的主文件。MyLib.cpp文件模拟主文件所须要的函数实如今还有一个文件。毕竟再小的项目也非常少仅仅有一个cpp文件组成,CMakeLists.txt文件写好后是给Cent OS上的CMake工具使用的。

如今按[F5],程序在Windows上正确运行。

进入项目的目录中(...\CMake_Tutorial2\CMake_Tutorial2\)我们能够看到

CMAKE_TUTORIAL2

│  CMakeLists.txt

│  CMake_Tutorial2.vcxproj

│ CMake_Tutorial2.vcxproj.filters

│  CMake_Tutorial2.vcxproj.user

│  MyLib.cpp

│  Source.cpp

└─Debug

六个文件一个Debug目录,当中仅仅有CMakeLists.txt、MyLib.cpp、Source.cpp三个文件才是我们在Linux上编译出可运行程序所须要的,可是为了方便我们把“CMake_Tutorial2”整个目录上传到linux系统上。

[S1]我把文件夹上传到CentOS操作系统的/home/kagula/Downloads文件夹下,[S2]在控制台下输入“cd  CMake_Tutorial2”命令,在当前文件夹我们能够看到原来在Windows系统下的六个文件和一个Debug文件夹。

基本操作流程为:

  1. $> cmake directory
  2. $> make

[S3]在当前文件夹下使用“mkdir build”命令建立build文件夹。

[S4]“cd build”。

[S5]“cmake ..”命令在当前文件夹(Build文件夹)生成Makefile文件。“..”參数指示CMake工具,CMakeLists.txt文件在父文件夹中。

[S6]输入“make”命令后,进行编译链接,在当前文件夹生成CMake_Tutorial2可运行程序,

[S7]输入“./CMake_Tutorial2”,程序执行并输出“Hello,WorldFrom Cent OS!”字符串。输入随意字符后敲回车,程序结束执行。

在Linux上使用CMake的第二个样例

这个样例相对于上面一个

[1]添加了分布在不同文件夹的源文件。

现实世界中多个C++源文件会分布在不同的文件夹中,这个样例模拟了这样的情况。

[2]宏的定义。

在Win上跑的程序,不一定在Linux上也能顺利跑。所以有时候须要在程序中依据_DEBUG宏的定义输出程序执行状态。

这里的难点是CMakeLists.txt文件的编辑

在Visual Studio上建立Win32 控制台项目CMake_Tutorial2_2, 经调试能够执行后,再把CMake_Tutorial2_2整个project文件夹上传到Cent OS上。在Cent OS上做測试的时候我把它放在了/home/kagula/Downloads/CMake_Tutorial2_2/中。

源文件文件夹结构例如以下。

CMAKE_TUTORIAL2_2

│ CMakeLists.txt

│ CMake_Tutorial2_2.vcxproj

│ CMake_Tutorial2_2.vcxproj.filters

├─Debug

│  │  CMake_Tutorial2_2.log

│  │  FromMyLib1.obj

│  │  FromMyLib2.obj

│  │  Source.obj

│  │  vc120.idb

│  │  vc120.pdb

│  │

│  └─CMake_Tu.3A7B3807.tlog

│         cl.command.1.tlog

│         CL.read.1.tlog

│         CL.write.1.tlog

│         CMake_Tutorial2_2.lastbuildstate

│         link.command.1.tlog

│         link.read.1.tlog

│         link.write.1.tlog

├─MyLib1

│     CMakeLists.txt

│     FromMyLib1.cpp

│     FromMyLib1.h

└─src

       CMakeLists.txt

       Source.cpp

能够看到每一个含源码的目录中必须有一个CMakeLists.txt文件。所以这里共同拥有三个CMakeLists.txt文件。

CMakeLists.txt源文件清单

#指定可运行程序输出路径为运行cmake时路径的bin子路径
#默认是输出到运行cmake命令时的路径
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)#CMake运行时,打印路径
MESSAGE(${PROJECT_SOURCE_DIR}/MyLib1)
#加入头文件搜索路径
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/MyLib1)#加入库文件搜索路径
LINK_DIRECTORIES(${PROJECT_BINARY_DIR}/lib)#用于将当前文件夹下的全部源文件的名字保存在变量 APP_SRC 中
AUX_SOURCE_DIRECTORY(. APP_SRC)#假设调用"CMake -D DEBUG_MODE=ON .."
#则为C++源文件设置_DEBUG宏
IF(DEBUG_MODE)ADD_DEFINITIONS(-D_DEBUG)
ENDIF()#用于指定从一组源文件 source1 source2 … sourceN(在变量APP_SRC中定义)
#编译出一个可运行文件且命名为CMake_Tutorial2_2
ADD_EXECUTABLE(CMake_Tutorial2_2 ${APP_SRC})#加入编译可运行程序所须要的链接库、假设有多个中间用空格隔开
#第一个參数是可运行程序名称,第二个開始是依赖库
#在这里依据名字mylib1去寻找libmylib1.a文件(Linux下的C++静态库文件)
TARGET_LINK_LIBRARIES(CMake_Tutorial2_2 mylib1)

如今进入到Cent OS系统下

使用以下的命令

$pwd

显示当前路径为“/home/kagula/Downloads/CMake_Tutorial2_2/”

$mkdir build

$cd build

$cmake ..

调用cmake处理上一级文件夹的CMakeLists.txt文件,生成Makefile文件。

$make

当前文件夹会生成lib子文件夹。存放libmylib1.a静态库文件。生成bin子文件夹存放CMake_Tutorial2_2可运行文件,进入bin子文件夹可直接运行CMake_Tutorial2_2可运行程序。

假设要启用_DEBUG宏

使用以下的命令取代“cmake  ..”

$cmake -D DEBUG_MODE=on  ..

以下给出当前实例用到的三个C++源文件清单

FromMyLIb1.h源代码清单

#ifndef _FROMMYLIB1_H_
#define _FROMMYLIB1_H_void FromMyLib1Func();#endif

FromMyLIb1.cpp源代码清单

#include "FromMyLib1.h"
#include <iostream>using namespace std;void FromMyLib1Func()
{wcout << L"The function from MyLib1 directory!" << endl;
}

Source.cpp源代码清单

#include <stdio.h>
#include <iostream>#ifdef WIN32
#include "..\MyLib1\FromMyLib1.h"
#else
#include "../MyLib1/FromMyLib1.h"
#endifusing namespace std;int main(int argc, wchar_t** argv)
{
#ifdef _DEBUGwcout << L"App in Debug Mode" << endl;
#elsewcout << L"Release Mode" << endl;
#endifFromMyLib1Func();getchar();return 0;
}

假设。改动了项目的源码

清除生成的2进制代码

$make clean

又一次编译

$make

 

 

假设,改动了CMakeLists.txt文件

须要又一次调用cmake命令

boost库含有编写C++应用程序所须要的非常多基本API。

下一篇介绍含boost调用的Win32控制台项目。怎样借助cmake工具把依赖boost的项目移植到Cent  OS系统上执行。

參考资料

[1]《CMake使用入门》

http://jiyeqian.is-programmer.com/2011/7/4/cmake_tutorial.27813.html

[2]《makefile: CMAKE的使用》-介绍CMake使用过程中的常见问题

http://blog.chinaunix.net/uid-23381466-id-3826931.html

CMake入门(二)相关推荐

  1. CMake入门二——子目录的嵌套

    子目录嵌套 需要子目录的原因:在一个项目中,不可能用一个cpp文件包含所有的功能,故分为多个模块在不同目录中.在每个模块中,可以单独编译,再和其他模块解耦(组合). 添加子目录:每个模块(子目录)中都 ...

  2. C++ CMake入门和进阶(二):CMake语法

    CMake也是有语法的,这里总结一些.CMake系列学习个人笔记: C++ CMake入门和进阶(一):使用CMake编译项目 文章目录 输出 message 分支 if/elseif/else/en ...

  3. conan入门(二):conan 服务配置-密码管理及策略

    conan 服务配置 密码管理及策略配置 第一次以管理员身份(admin)使用默认密码(password)WEB登录入JFrog Artifactory后台时,系统就提示要求我修改密码,因为现有密码太 ...

  4. conan入门(二十):封装只包含头文件(header_only)的库示例

    conan: 封装只包含头文件(header_only)的库示例 有的C/C++项目只包含头文件,不需要编译,对于这种情况如何封装为Conan的包呢? Conan官方文档 <Package sc ...

  5. 超详细的cmake入门教程【转载】

    这篇文章主要介绍了超详细的cmake入门教程,需要的朋友可以参考下 源出处 超详细的cmake入门教程 什么是cmake 在 linux 平台下使用 CMake 生成 Makefile 并编译的流程 ...

  6. SQL基础使用入门(二): DML语句和DCL语句

    SQL语句第二个类别--DML 语句 DML是数据操作语言的缩写,主要用来对数据表中数据记录实例对象进行操作,包括插入.删除.查找以及修改四大操作,这也是开发人员使用中最为频繁的操作. 1.插入记录 ...

  7. 文本分类入门(二)文本分类的方法

    文本分类入门(二)文本分类的方法 文本分类问题与其它分类问题没有本质上的区别,其方法可以归结为根据待分类数据的某些特征来进行匹配,当然完全的匹配是不太可能的,因此必须(根据某种评价标准)选择最优的匹配 ...

  8. [转] CMake入门

    转载说明: 文章转自网络,版权归原作者所有, 原文链接: https://www.hahack.com/codes/cmake/ 特别感谢发哥(写代码的篮球痴 )分享 文章目录 ▌什么是 CMake? ...

  9. 转 Python爬虫入门二之爬虫基础了解

    静觅 » Python爬虫入门二之爬虫基础了解 2.浏览网页的过程 在用户浏览网页的过程中,我们可能会看到许多好看的图片,比如 http://image.baidu.com/ ,我们会看到几张的图片以 ...

最新文章

  1. 虚拟函数是否应该被声明仅为private/protected?
  2. 完成这个例子,说出java中针对异常的处理机制。
  3. 剑指Offer(Java实现)把二叉树打印成多行
  4. linux远程windows执行cmd,Linux服务器远程连接window服务器并执行cmd命令
  5. C#LeetCode刷题之#811-子域名访问计数​​​​​​​(Subdomain Visit Count)
  6. oracle into 循环,oracle游标中使用select into查询结果为NULL导致异常提前退出循环——菜鸟解决办法(^_^)...
  7. C语言的结构变量定义规则,嵌入式学习笔记:c语言结构体的定义和使用
  8. plc顺序控制设计法是什么?
  9. Index Notation
  10. C++11(及现代C++风格)和快速迭代式开发 -- 刘未鹏
  11. 《今日求职》之拉勾网Android客户端产品说明
  12. Exploiting Spatial Structure for Localizing Manipulated Image Regions
  13. Java安装方法(详细)
  14. debian安装 Debian的一些常用命令
  15. Day46(列表标签,表格标签,表单标签,css的引入方式,css选择器)
  16. 初中计算机会考不及格,初中会考不及格能毕业吗
  17. 3h精通OpenCV(七)-颜色检测
  18. 运营中的瓶颈管理,你知道多少?
  19. 《游戏改变世界》——在枯燥的学习中也体验到游戏中的心流~
  20. 大学生可参加的含金量比赛

热门文章

  1. 树展示 移动端_百度移动端开始用网站品牌名代替网址显示
  2. php suse 安装mysql_SUSE Linux apache,Mysql,php,svn的安装
  3. python转cpp_python转c工具
  4. go 字符串转日期_Go技术日报(20200831)
  5. Java中stringbutter_java中string与ButterString的区别
  6. php mail centos_centos怎么发送邮件
  7. java没有timer类_Java中的Java.util.Timer类 - Break易站
  8. sublime默认html,Sublime Text默认HTML评论
  9. asp.net button创建控件时出错_Tkinter Radiobutton控件
  10. IP地址、子网掩码、网关、默认网关、DNS的理解