cmake使用总结(转)---工程主目录CMakeList文件编写

在linux 下进行开发很多人选择编写makefile 文件进行项目环境搭建,而makefile 文件依赖关系复杂,工作量很大,搞的人头很大。采用自动化的项目构建工具cmake 可以将程序员从复杂的makefile 文件中解脱出来。cmake 根据内置的规则和语法来自动生成相关的makefile 文件进行编译,同时还支持静态库和动态库的构建,我把工作中用到的东东总结在此,方便忘记时随时查看,具体cmake的介绍和详细语法还是参考官方文档(http://www.cmake.org/),有一篇中文的cmake 实践 写的不错,可以google一下。

     使用cmake 很简单,只需要执行cmake, make 两个命令即可,用我工作中的一个工程举例说明。

      假设当前的项目代码在src 目录。 src 下有子目录:server, utility, lib, bin, build

      server -----  存放项目的主功能类文件

      utility  -----  存放项目要用到相关库文件,便已成为库文件存放到子目录lib 中

      lib       -----  存放utility 生成的库

      bin      -----  存放association 生成的二进制文件

      build   -----  编译目录,存放编译生成的中间文件

   

      cmake 要求工程主目录和所有存放源代码子目录下都要编写CMakeLists.txt 文件,注意大小写(cm 大写,list中l 大写且落下s).

      src/CMakeLists.txt 文件如下:

      -------------------------------------------------------------------------------------------------------------

      #cmake file for project association                     #表示注释
      #author:>---double__song
      #created:>--2011/03/01

      CMAKE_MINIMUM_REQUIRED(VERSION 2.8)      #cmake 最低版本要求,低于2.6 构建过程会被终止。

      PROJECT(server_project)                                             #定义工程名称

      MESSAGE(STATUS "Project: SERVER")               #打印相关消息消息
      MESSAGE(STATUS "Project Directory: ${PROJECT_SOURCE_DIR}")

      SET(CMAKE_BUILE_TYPE DEBUG)                      #指定编译类型


      SET(CMAKE_C_FLAGS_DEBUG "-g -Wall")          #指定编译器
     
      ADD_SUBDIRECTORY(utility)                              #添加子目录
      ADD_SUBDIRECTORY(server)
    -------------------------------------------------------------------------------------------------------------

      相关解释:

      1. CMakeLists.txt 文件中不区分大小写

      2. PROJECT(project_name)    定义工程名称

          语法:project(projectname [cxx] [c] [java])

          可以指定工程采用的语言,选项分别表示:C++, C, java, 如不指定默认支持所有语言

      3. MESSAGE(STATUS, "Content")  打印相关消息

          输出消息,供调试CMakeLists.txt 文件使用。

      4. SET(CMAKE_BUILE_TYPE DEBUG)  设置编译类型debug 或者release。 debug 版会生成相关调试信息,可以使用GDB 进行 

          调试;release不会生成调试信息。当无法进行调试时查看此处是否设置为debug.

      5. SET(CMAKE_C_FLAGS_DEBUG "-g -Wall") 设置编译器的类型

          CMAKE_C_FLAGS_DEBUG            ----  C 编译器

          CMAKE_CXX_FLAGS_DEBUG        ----  C++ 编译器

       6. ADD_SUBDIRECTORY(utility) 添加要编译的子目录

           为工程主目录下的存放源代码的子目录使用该命令,各子目录出现的顺序随意。

       如上便是工程server_project 主目录src 下的CMakeLists.txt 文件,下一篇我们解释子目录utiltiy中的CMakeLists.txt 文件。

 

子目录utility 下的CMakeLists.txt 文件如下:

--------------------------------------------------------------------------------------------------------------------
     #Cmake file for library utility.a
     #Author:       double__song
     #Created:     2011/3/3


     SET(SOURCE_FILES                                  #设置变量,表示所有的源文件
     ConfigParser.cpp
     StrUtility.cpp
     )


     INCLUDE_DIRECTORIES(                          #相关头文件的目录
     /usr/local/include
     ${PROJET_SOURCE_DIR}/utility
     )


    LINK_DIRECTORIES(                                  #相关库文件的目录
    /usr/local/lib

    )


    ADD_LIBRARY(association ${SOURCE_FILES})         #生成静态链接库libassociation.a

    TARGET_LINK_LIBRARY(association core)                #依赖的库文件

   
    SET_TARGET_PROPERTIES(utility  PROPERTIES    #表示生成的执行文件所在路径
    RUNTIME_OUTPUT_DIRECTORY> "${PROJECT_SOURCE_DIR}/lib")

 

--------------------------------------------------------------------------------------------------------------------
    相关解释:

    1. SET(SOURCE_FILES .....)  

    表示要编译的源文件,所有的源文件都要罗列到此处。set 设置变量,变量名SOURCE_FILES自定义。

    2. INCLUDE_DIRECTORY(...)  

    include头文件时搜索的所有目录

    变量PROJECT_SOURCE_DIR 表示工程所在的路径,系统默认的变量

    3. LINK_DIRECTORIES(...)

     库文件存放的目录,在程序连接库文件的时候要再这些目录下寻找对应的库文件

    4. ADD_LIBRARY(...) 

     表示生成静态链接库libassociaiton.a,由${PROJECT_SOURCE_DIR}代表的文件生成。

     语法:ADD_LIBRARY(libname [SHARED|STATIC]

     SHARED 表示生成动态库, STATIC表示生成静态库。

    5. TARGET_LINK_LIBRARY(association core) 

     表示库association 依赖core库文件

     6. SET_TARGET_PROPERTIES

     设置编译的库文件存放的目录,还可用于其他属性的设置。如不指定,

     生成的执行文件在当前编译目录下的各子目录下的build目录下,好拗口!简单一点:

     如指定在: ./src/lib 下

     不指定在: ./src/build/utility/build 目录下

     生成的中间文件在./src/build/utilty/build 目录下,不受该命令额影响

 

     子目录server 下的CMakeLists.txt 文件:

      --------------------------------------------------------------------------------------------
     SET(SOURCE_FILES
     Gassociation.cpp
     ConfigurationHandler.cpp
     )

     INCLUDE_DIRECTORIES(

      /usr/local/include
      ${PROJECT_SOURCE_DIR}/utility
      ${PROJECT_SOURCE_DIR}/association
     )

     LINK_LIBRARIES(
     /usr/local/lib
     ${PROJECT_SOURCE_DIR}/lib
     )

     ADD_EXECUTABLE(server  ${SOURCE_FILES})

     TARGET_LINK_LIBRARIES(server
     utility

     )

     SET_TARGET_PROPERTIES(server  PROPERTIES    #表示生成的执行文件所在路径
     RUNTIME_OUTPUT_DIRECTORY  "${PROJECT_SOURCE_DIR}/bin")

     -------------------------------------------------------------------------------------------------------

     相关解释:

     1. ADD_EXECUTABLE()     #指定要生成的执行文件的名称server

      其他用法同utilty/CMakeLists.txt

     2. SET_TARGET_PROPERTIES

      设置生成的执行文件存放的路径,

      注意:

      执行文件server 依赖的子目录utility 子目录生成的静态库libutility.a,在指定的时候要写成:
      TARGET_LINK_LIBRARIES(server   utility)

      而不能写成:

      TARGET_LINK_LIBRARIES(server   libutility.a)

      否则编译总会提示找不到libutility库文件。

      但使用第三方的库却要指定成具体的库名,如:libACE-6.0.0.so

      这一点很诡异,暂时还没找到原因。

 

      完成对应的CMakeLists.txt 文件编写后,便可以进行编译了。

      编译:

            进入 ./src/build

            执行cmake ..

            make

 

       cmake 的使用很简单,更高级的应用好比版本信息,打包,安装等相关基本的应用后面会一一介绍,

      复杂的语法使用要参考官方文档。

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

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

相关文章

微信开发者工具 wxmi修改模版颜色_十款高效好用的在线网页工具,提升你的办公效率...

大家好, 我是阿毛,今天给大家推荐高效办公的10个在线网页工具,可以不用下载安装很多app,也不用在电脑上装很多软件。在线制作精彩视频操作非常简单,选择模板,上传照片然后点击制作等待完成就可以了&#xf…

三星ml1660拆机图解_三星s6拆机图解介绍

三星s6拆机图解介绍三星s6怎么拆机?不管你是手机维修者还是狂热的手机玩家,相信对您手中的三星s6内部构造和组装步骤应该都是非常有兴趣的吧?今天绿茶通过Fixit发布的三星s6拆机教程来和大家一起分享一下三星s6拆机步骤,从三星s6的内部构造一起来了解一…

Ajax请求利用jsonp实现跨域

跨域: js有一个同源限制,简单说来源不一样的话就无法相互间交互.那么怎么算来源不一样呢, 举个例子:浏览器访问-->服务器A--->得到页面A---页面A中的js脚本只能访问服务器A的资源(相同域名和端口,此外域名与对应的ip也算不同源,要么都域名,要么都ip). 以上就是js的跨域问…

[转]使用Navicat for Oracle工具连接oracle的

使用Navicat for Oracle工具连接oracle的 这是一款oracle的客户端的图形化管理和开发工具,对于许多的数据库都有支持。之前用过 Navicat for sqlserver,感觉很好用,所以下载了Oracle版的用。上网查看了一下这个工具可以用于任何版本 8i 或以上的 Oracle …

微信小程序基于第三方插件微信同声传译,以及一些问题解决办法

使用之前首先得在微信微信小程序后台添加插件,获取插件的appid 名称 使用时在app.json文件添加插件配置 1 plugins: { 2 WechatSI: { 3 version: 0.1.0, 4 provider: wx069ba97219f66d99 5 } 6 } 其次就是在使用的页面进行调用 在index.js外…

TF卡里删掉文件后内存没变大_内存卡损坏怎么修复?数据恢复方法教程

内存卡损坏怎么修复?内存卡又叫SD卡,是一种很轻便小巧的便携存储装置,往往内置于各种便携媒体设备内部。内存卡本身具有坚固、抗冲击等外部特性和读写快、空间大等内部特性,但是内存卡因为每天都要读写大量数据很容易从内部发生损…

apollo持久化sentinel_Spring Cloud Alibaba基础教程:Sentinel使用Apollo存储规则

上一篇我们介绍了如何通过Nacos的配置功能来存储限流规则。Apollo是国内用户非常多的配置中心,所以,今天我们继续说说Spring Cloud Alibaba Sentinel中如何将流控规则存储在Apollo中。使用Apollo存储限流规则Sentinel自身就支持了多种不同的数据源来持久…

Lintcode: Unique Paths

C dp 递推式&#xff1a;dp[i][j] dp[i-1][j] dp[i][j-1] 初值&#xff1a;dp[i][j] 1&#xff0c;i0 or j0 空间优化&#xff1a;省掉一维 1 class Solution {2 public:3 /**4 * param n, m: positive integer (1 < n ,m < 100)5 * return an integer6…

idea 如何隐藏/展示不想看到的文件

隐藏&#xff1a;在 Ignore files and folders中添加想要过滤的文件或文件夹名称 展示隐藏文件&#xff1a; 在过滤列表中删除掉文件或者文件夹就好了 转载于:https://www.cnblogs.com/mengjianzhou/p/6177897.html

BZOJ2286: [Sdoi2011]消耗战(虚树)

BZOJ2286: [Sdoi2011]消耗战 Time Limit: 20 Sec   Memory Limit: 512 MB Description 在一场战争中&#xff0c;战场由n个岛屿和n-1个桥梁组成&#xff0c;保证每两个岛屿间有且仅有一条路径可达。现在&#xff0c;我军已经侦查到敌军的总部在编号为1的岛屿&#xff0c;而且…

Java基础知识:Java实现Map集合二级联动4

comboBox.setModel(new DefaultComboBoxModel(getProvince())); // 添加省份信息 final JLabel label new JLabel(); label.setText("省/直辖市"); label.setBounds(155, 30, 66, 18); panel.add(label); final JLabel label_1 new JLabel(); label_1.setText(&quo…

linux QT 结束当前进程_Qt编写控件属性设计器7-串口采集

一、前言数据源是组态软件的核心灵魂&#xff0c;少了数据源&#xff0c;组态就是个花架子没卵用&#xff0c;一般数据源有三种方式获取&#xff0c;串口、网络、数据库&#xff0c;至于数据规则是什么&#xff0c;这个用户自己指定&#xff0c;本设计器全部采用第一个字节作为…

magento2邮件调试方法

order mail 直接打印到页面上 位置 vendor\magento\module-sales\Model\Order\Email\Sender.php Magento\Sales\Model\Order\Email\Sender::prepareTemplate() 添加代码 $objectManager \Magento\Framework\App\ObjectManager::getInstance(); $templateFactory $objectManag…

python多进程怎么样_Python执行多进程任务的方法

Python的多进程可以借助from multiprocessing import Pool来实现。简而言之分为这样几步&#xff1a;导入包from multiprocessing import Pool编写任务函数。def 任务函数(参数)实例化进程池并设置进程数。poolPool(欲设置的进程数)开始布置任务&#xff0c;把多个任务添加进多…

JAVA多线程之Synchronize 关键字原理

image众所周知 Synchronize 关键字是解决并发问题常用解决方案&#xff0c;有以下三种使用方式: 同步普通方法&#xff0c;锁的是当前对象。同步静态方法&#xff0c;锁的是当前 Class 对象。同步块&#xff0c;锁的是 {} 中的对象。实现原理&#xff1a;JVM 是通过进入、退出对…

iOS-数据持久化-第三方框架FMDB的使用

FMDB简单介绍 一、简单说明 1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来更加面向对象&#xff0c;省去了很多麻烦、冗余的C语言代码 对比苹果自带的Core Data框架&#xff0c;更加轻量级和灵活 提供了多线程安全…

电脑word文档打不开怎么办_word怎么转pdf?两个值得学习的高效转换法

word怎么转pdf&#xff1f;两个值得学习的高效转换法word怎么转pdf&#xff1f;pdf格式是我们经常能够使用到的格式&#xff0c;因为pdf格式在传递的过程中能更好地避免文件出现乱码打不开或误触导致文件被修改的情况。那如果想要把word文件转换成pdf格式以避免阅读word时文件被…

sql server常用函数、常用语句

一、常用函数 1.字符串函数 &#xff1a; charindex(:,abc:123) --寻找一个字符在一段字符串中起始的位置 len(zhangsan) --获取一段字符串的长度 left(Ly,君子之耀,2) --从一段字符串左边返回指定长度的字符 right(char_expr,int_expr) --返回字符串右边int_expr个字符 …

python 矩阵乘法 跳过nan_python – Numpy:当一些向量元素等于零时,矩阵向量乘法不会跳过计算吗?...

我最近一直致力于一个项目,其中我的大部分时间花费在密集矩阵A和稀疏向量v上(见here).在我尝试减少计算时,我注意到A.dot(v)的运行时间不受v的零条目数的影响.为了解释为什么我希望在这种情况下改进运行时,让result A.dot.v使得j 1的结果[j] sum_i(A [i,j] * v [j])… v.sha…

[转]Responsive Tables Demo

本文转自&#xff1a;http://elvery.net/demo/responsive-tables/ A quick and dirty look at some techniques for designing responsive table layouts. This was put together in haste (and with the aid of Twitter Bootstrap) for What Do You Know Brisbane hosted by W…