zoukankan      html  css  js  c++  java
  • 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 WIN32
    	wcout << L"Hello,World From Windows!" << endl;
    #else
    	wcout << 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_Tutorial2CMake_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 "..MyLib1FromMyLib1.h"
    #else
    #include "../MyLib1/FromMyLib1.h"
    #endif
    
    using namespace std;
    
    int main(int argc, wchar_t** argv)
    {
    #ifdef _DEBUG
    	wcout << L"App in Debug Mode" << endl;
    #else
    	wcout << L"Release Mode" << endl;
    #endif
    
    	FromMyLib1Func();
    
    	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


  • 相关阅读:
    SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
    Oracle中如何插入特殊字符: &amp;amp; 和 &amp;#39; (多种解决方案)
    oracle学习链接
    ORACLE中的游标Cursor总结
    SVN使用教程总结
    SVN使用教程之-分支/标记 合并 subeclipse
    weblogic启动 web应用ssh关闭 nohup命令
    Oracle 学习之:ASCII,CHR函数的作用和用法
    Oracle数据库单表循环提取输出
    设计模式-七大原则
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5122009.html
Copyright © 2011-2022 走看看