CMake入门(二)

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.txtMyLib.cppSource.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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/543747.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Scala中的评论

Scala评论 (Scala comments) Comments are things that are readable by the programmer. They are added to the code to add an explanation about the source code. Commenting on a program to make it easier to understand by the programmer. 注释是程序员可以读取的东西…

最小生成树prim (c++ 已大改)

2019独角兽企业重金招聘Python工程师标准>>> #include <iostream> #include <vector> #include <set> #include <map> #include <initializer_list> #include <memory> template<typename T> class Graph{private:std::m…

assoc_Ruby assoc()函数

assocRuby中的assoc()函数 (assoc() function in Ruby) We have studied functions to process single dimensional array so far but if we talk about assoc() function, it does not work for single dimensional arrays. assoc() function only works on Array of Arrays o…

前端接入HTTP协议浅析

【摘要】&#xff1a;本文整理并简要分析了HTTP协议的交互过程和内容格式&#xff0c;包括HTTP请求、HTTP应答的头域和实体内容&#xff0c;HTTP 1.0与HTTP 1.1的差异&#xff0c;并举例说明了Chunked编码的工作过程原理。1、HTTP协议简介浏览器和Web服务器之间一问一答的交互过…

互联网传真 传真指令_传真的完整形式是什么?

互联网传真 传真指令传真&#xff1a;传真 (FAX: Facsimile) FAX is an abbreviation of "Facsimile". 传真是“传真”的缩写 。 It is commonly written and spoken as FAX. It is a telephonic transmission of a scanned copy of text and images printed on a p…

C#使用七牛云存储上传下载文件、自定义回调

项目需要将音视频文件上传服务器&#xff0c;考虑并发要求高&#xff0c;通过七牛来实现。 做了一个简易的压力测试&#xff0c;同时上传多个文件&#xff0c;七牛自己应该有队列处理并发请求&#xff0c;我无论同时提交多少个文件&#xff0c;七牛是批量一个个排队处理了。 一…

netfilter que_QUE的完整形式是什么?

netfilter que问题&#xff1a;问题 (QUE: Questions) QUE is an abbreviation of "Questions". QUE是“ Questions”的缩写 。 It is an expression, which is commonly used in the Gmail platform. It is written in the body or the subject of the email to te…

mysqld_multi stop 不能停掉mysql

使用mysqld_multi start 启动了多个mysql&#xff0c;但是mysqld_multi stop 却不能停止原因&#xff1a;因为你还没有授权/usr/local/mysql/bin/mysqld_multi stop 但是默认是停不掉的&#xff0c;需要我们做一个授权grant shutdown on *.* to usernamelocalhost identified…

热冗余冷冗余_冗余支架

热冗余冷冗余Problem statement: 问题陈述&#xff1a; Given a string of balanced expression, find if it contains a redundant parenthesis or not. A set of parentheses is redundant if the same sub-expression is surrounded by unnecessary or multiple brackets. …

对称树

Problem statement: 问题陈述&#xff1a; Given a binary Tree, check whether the tree is symmetric or not. 给定二叉树 &#xff0c; 检查树是否对称 。 Input Example: 输入示例&#xff1a; For example1/ \2 2/ \ / \3 4 4 3The above tree is symmetric1/ \2 …

unity, undo

如果在操作一个Object之前调用Undo.RecordObject(Object)&#xff0c;且操作确实造成Object某些属性的改变&#xff0c;则会产生一个undo记录。 如果我们的架构不是直接操作Object&#xff0c;而是操作一个ui&#xff0c;并在某些时机通过ui.save(Object)将数据回写到Object&am…

ajax应用_AJAX的应用

ajax应用AJAX has several benefits that can be utilized inside a web application. In this article, well explore some advantages of AJAX and see some of its applications. AJAX具有可在Web应用程序内部使用的多个优点。 在本文中&#xff0c;我们将探讨AJAX的一些优势…

Linux下DRBD配置

一、什么是DRBD1、简介 Distributed Replicated Block Device(DRBD)是一个用软件实现的、无共享的、服务器之间镜像块设备内容的存储复制解决方案。数据镜像&#xff1a;实时、透明、同步&#xff08;所有服务器都成功后返回&#xff09;、异步&#xff08;本地服务器成功后返回…

键盘特殊_特殊键盘

键盘特殊Problem statement: 问题陈述&#xff1a; Imagine you have a special keyboard with four types of keys: 想象一下&#xff0c;您有一个特殊的键盘&#xff0c;其中包含四种类型的键&#xff1a; Key 1: Prints I on screen 按键1&#xff1a;在屏幕上打印“ I”…

【C++入门】简单的日期类操作

//--------------------------------------------------------------------------/***名称&#xff1a;日期的简单操作******类函数&#xff1a;构造函数&#xff0c;拷贝构造函数&#xff0c;析构函数&#xff0c;操作符重载函数****日期类操作函数&#xff1a; 1&#xff1a;…

Scala山脉

Scala Range Scala山脉 A Range is a bounded series with a uniform interval with an upper and lower limit. The range literal is a numerical sequence of number ranging with a certain limit. 范围是一个有上限且下限均匀的有界序列。 范围文字是具有一定限制的范围…

黑客经验谈:跳板攻击入侵技术实例解析

网络入侵&#xff0c;安全第一,一个高明的入侵者&#xff0c;不会冒然实行动. 他们在入侵时前会做足功课&#xff0c;入侵时会通过各种技术手段保护自己&#xff0c;以防被对方发现&#xff0c;引火烧身. 其中&#xff0c;跳板技术是攻击者通常采用的技术. 下面笔者结合实例&am…

dom属性和html属性_HTML属性

dom属性和html属性Attributes are used to provide additional information of a tag such as it’s alignments, color, size of the text and other. The attributes are given with the tag that is between the angular brackets after the tag name. The attributes have …

科普:UTF-8 GBK UTF8 GB2312 之间的区别和关系

UTF-8&#xff1a;Unicode TransformationFormat-8bit&#xff0c;允许含BOM&#xff0c;但通常不含BOM。是用以解决国际上字符的一种多字节编码&#xff0c;它对英文使用8位&#xff08;即一个字节&#xff09;&#xff0c;中文使用24为&#xff08;三个字节&#xff09;来编码…

vue3实现本地开发使用的px转换成vw,px转换成rem方法整理

前言&#xff1a; 项目中如果想本地开发使用px&#xff0c;但是界面上线以后界面是自适应的效果,可以有多种方式来实现效果。 一、px转成vw 1、安装&#xff0c;安装成功后&#xff0c;node_modules 会新增这两个插件包 npm i postcss-px-to-viewport-8-plugin 2、新增 post…