cmake是一款生成makefile的软件;在生成makefile之前,首先是写一个CMakeLists.txt文件;

以下为典型例子:

  先看目录tree, 在test文件夹中有:include目录, source目录, 以及main.c

                source目录下有afile.c, bfile.c

                include目录下有temp.h

  afile.c中: 

#include "../include/temp.h"
#include <stdio.h>
void func_a()
{
printf("this is func_a test\n");
}

  bfile.c中:

#include "../include/temp.h"
#include <stdio.h>
void func_b()
{
printf("this is func_b test\n");
}

  temp.h中:

void func_a();
void func_b();

  main.c中:

#include "include/temp.h"
int main()
{
func_a();
func_b(); printf("hello world\n");
return ;
}

  在test目录下新建文件CMakeLists.txt,  内容如下:

PROJECT(main)
CMAKE_MINIMUM_REQUIRED(VERSION 2.6) ADD_DEFINITIONS(-DENABLEDEBUG)
ADD_DEFINITITONS(-g) AUX_SOURCE_DIRECTORY(source SRC_DIR)
SET(MAIN_DIR main.c ${SRC_DIR}) ADD_EXECUTABLE(main ${MINI_DIR})

PROJECT指令的语法是:

  PROJECT(projectname [CXX] [C] [Java])
  可以用这个指令定义工程名称,并可指定工程支持的语言,支持的语言列表是可以忽略的,默认情况表示支持所有语言。

SET指令的语法是:

  SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])

  只需要了解SET指令可以用来显式的定义变量即可。比如我们用到的是SET(SRC_LIST main.c),如果有多个源文件,也可以定义成:SET(SRC_LIST main.c t1.c t2.c)

  

ADD_EXECUTABLE(hello  ${SRC_LIST})

  定义了这个工程会生成一个文件名为hello的可执行文件,相关的源文件是SRC_LIST中定义的源文件列表;  ${}是表示取值;

ADD_DEFINITIONS

  向C/C++编译器添加-D定义,比如:ADD_DEFINITIONS(-DENABLE_DEBUG),参数之间用空格分割

                  ADD_DEFITIONS(-g)

AUX_SOURCE_DIRECTORY(dir VARIABLE)作用是发现一个目录下所有的源代码文件并将列表存储在一个变量中,这个指令临时被用来自动构建源文件列表

  写完CMakeLists.txt之后;

        cmake .  之后就可以发现生成了makefile;

        make即可;

动态库构建   

PROJECT (main)
ADD_DEFINITIONS(-DPOSIX)
ADD_DEFINITIONS(-DDEBUG) AUX_SOURCE_DIRECTORY(source DIR_SRC)
SET(MAIN_SRCS ${DIR_SRC}) ADD_LIBRARY(main SHARED ${MAIN_SRCS})

静态库构建

PROJECT (main)
ADD_DEFINITIONS(-DPOSIX)
ADD_DEFINITIONS(-DDEBUG) AUX_SOURCE_DIRECTORY(source DIR_SRC)
SET(MAIN_SRCS ${DIR_SRC}) ADD_LIBRARY(main STATIC ${MAIN_SRCS})

安装库和头文件

1.只需在CMakeLists.txt添加:
  共享库(动态库)加入:

  INSTALL(TARGETS main LIBRARY DESTINATION lib)

  静态库则加入:

  INSTALL(TARGETS main ARCHIVE DESTINATION lib)

2.头文件安装命令:

  INSTALL(FILES include/tmp.h DESTINATION include/lib)

3.通过:

  cmake -DCMAKE_INSTALL_PREFIX=/usr .

  make

  make install

  可以将头文件和共享库安装到系统目录/usr/lib和/usr/include中

makefile之cmake入门的更多相关文章

  1. CMake入门(二)

    CMake入门(二) 最后更新日期:2014-04-25 by kagula 阅读前提:<CMake入门(一)>.Linux的基本操作 环境: Windows 8.1 64bit英文版.V ...

  2. CMake入门

    CMake入门 CMake是一个跨平台的安装编译工具,可以用简单的语句来描述所有平台的安装(编译过程).他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似 ...

  3. CMake入门教程(转帖)

    本文转自:https://www.cnblogs.com/never--more/p/6921837.html CMake入门教程 参考文献:http://www.ibm.com/developerw ...

  4. CMake入门-04-自定义编译选项

    工作环境 系统:macOS Mojave 10.14.6 CMake: Version 3.15.0-rc4 Hello,World! - 自定义编译选项 CMake 允许为项目增加编译选项,从而可以 ...

  5. C++ CMake 入门实战[转载]

    C++ CMake 入门实战 2016-11-05 CMake用于跨平台的编译系统,对于通常的c/c++工程,都是通过make来进行编译的,CMake可以通过指令生成Makefile文件来指导整个项目 ...

  6. VScode 使用 CMake 入门

    参考 CMake 入门实战 在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下: 编写 CMake 配置文件 CMakeLists.txt . 执行命令 cmake PA ...

  7. CMake 入门实战 | HaHack

    CMake 入门实战 | HaHack undefined

  8. make、makefile、cmake、qmake对比

    作者:玟清链接:https://www.zhihu.com/question/27455963/answer/36722992来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...

  9. make ;makefile; cmake; qmake的区分

    1. make 是用来执行Makefile的.2. Makefile是类unix环境下(比如Linux)的类似于批处理的"脚本"文件.其基本语法是: 目标+依赖+命令,只有在目标文 ...

随机推荐

  1. 取PE文件的引入表和导出表

    直接上代码(这里列出C++和Delphi的代码),Delphi代码中包含导入及导出文件和函数列表,PE结构可参阅资料,很多很详细,需要注意的是,本例中是映射到内存,不是通过PE装载器装入的,所以对于节 ...

  2. 迎接 Windows Azure 和 DNN 挑战,几分钟内快速构建网站!

    编辑人员注释:本文章由高级商务策划师兼开发平台推广者 Neeti Gupta 撰写. 曾几何时,构建一个简单的网站需要耗费好几个月的时间.在过去,.NET 开发人员和设计社区的一些成员使用 DNN(以 ...

  3. 《小C QQ空间转帖、分享工具》之QQ空间数据传递的g_tk算法(C#)

    原文地址:http://user.qzone.qq.com/419067339/2 public string GET_HTTP(string url, string referer_post, st ...

  4. ar解压deb包

    解压文件 ar -x libstdc++6_4.7.2-5_i386.deb tar -zxvf data.tar.gz

  5. javascript第六课类型转换

    1.parseint(参数): 转换为整数,即使参数中的字符串包含字母数字混合,此方法也会自动一个一个判断和转换   parseInt(参数,进制);将参数通过几进制的方式转为数字 2.parsefl ...

  6. Cocoa 之 Core Data(2)- 代码示例

    前面详 细讲解了 Core Data 的框架以及设计的类,下面我们来讲解一个完全手动编写代码 使用这些类的示例,这个例子来自 苹果官方示例.在这个例子里面,我们打算做这样一件事 情:记录程序运行记录( ...

  7. 浅谈android的selector,背景选择器

    shape和selector的结合使用 (2013-04-07 11:11:00) 转载▼   分类: android 1.Shape (1)作用:XML中定义的几何形状 (2)位置:res/draw ...

  8. 利用协议代理实现导航控制器UINavigationController视图之间的正向传值和反向传值

    实验说明 (1)正向传值:比如A类里地值要传给B类用,就是我们先在A类中声明一个B类对象(当然B类头文件要import过来),然后把A类中得某个 值传递给B类中得某个值(所以需要在B类中先准备一个变量 ...

  9. Android入门——UI(8)——Fragment(2)

    先演示一下如何在一个activity中放置两个Fragment,先定义两个Fragment <?xml version="1.0" encoding="utf-8& ...

  10. C# DataTable 详解

    添加引用 using System.Data; 创建表 //创建一个空表 DataTable dt = new DataTable(); //创建一个名为"Table_New"的空 ...