在linux上用cmake编译c,CMake编译linux C++

CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CmakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。

CMake 可以编译源代码、制作程式库、产生适配器(wrapper)、还可以用任意的顺序建构执行档。CMake 支援 in-place 建构(二进档和源代码在同一个目录树中)和 out-of-place 建构(二进档在别的目录里),因此可以很容易从同一个源代码目录树中建构出多个二进档。CMake 也支援静态与动态程式库的建构。

“CMake”这个名字是“cross platform make”的缩写。虽然名字中含有“make”,但是CMake和Unix上常见的“make”系统是分开的,而且更为高阶。

[cmake 命令]

cmake .

make

make clean

重新编译,需要删除cmake的遗留文件

推荐编写shell脚本处理这点简单但是将会伴随着你无数次的事情

[clear cmake file shell]

echo "rm cmake cache begin..."

rm ./cmake_install.cmake

rm -r ./CMakeFiles

rm ./Makefile

rm ./CMakeCache.txt

echo "rm cmake cache end..."

[内部编译]

//CMakeLists.txt文件内容如下:

PROJECT (HELLO)      //工程名HELLO

SET(SRC_LIST main.c) //显示定义变量,并赋值

MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})

MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})

ADD_EXECUTABLE(hello ${SRC_LIST})

PROJECT指令的语法是:

PROJECT(projectname [CXX] [C] [Java])

SET(SRC_LIST main.c),如果有多个源文件,也可以定义成:SET(SRC_LIST main.c t1.c t2.c)。

MESSAGE指令的语法是:

MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display"

...)

这个指令用于向终端输出用户定义的信息,包含了三种类型:

SEND_ERROR,产生错误,生成过程被跳过。

SATUS,输出前缀为—的信息。

FATAL_ERROR,立即终止所有cmake过程.

HELLO_BINARY_DIR和HELLO_SOURCE_DIR是两个隐式变量

make clean即可对构建结果进行清理

[外部编译]

构建

1,为工程添加一个子目录src,用来放置工程源代码;

2,添加一个子目录doc,用来放置这个工程的文档hello.txt

3,在工程目录添加文本文件COPYRIGHT, README;

4,在工程目录添加一个runhello.sh脚本,用来调用hello二进制

4,将构建后的目标文件放入构建目录的bin子目录;

5,最终安装这些文件:将hello二进制与runhello.sh安装至/usr/bin,将doc目录的内容以及

COPYRIGHT/README安装到/usr/share/doc/cmake/t2

ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})就可以构建一个libhello_static.a的静态库了。

[CMakeList 例子]

PROJECT(PRONAME)  //工程名

SET(CMAKE_C_COMPILER "g++")  //选择编译器,默认是gcc

AUX_SOURCE_DIRECTORY(./ SRC_LIST) //添加源码目录

SET(EXECUTABLE_OUTPUT_PATH ../bin) //添加bin文件生成路径

ADD_DEFINITIONS(-g -W -Wall -DTIXML_USE_STL)

//ADD_DEFINITIONS添加一些宏,根据自己的程序需要

//添加头文件路径

INCLUDE_DIRECTORIES(

./

/home/hfx/src

)

//添加链接库路径

LINK_DIRECTORIES(

/usr/local/mysql/lib/mysql

)

//生成二进制文件

ADD_EXECUTABLE(helloworld ${SRC_LIST})

//生成LIB

ADD_LIBRARY(helloworld2 ${SRC_LIST})

//链接库

TARGET_LINK_LIBRARIES(mysqlclient_r)

//代码位置无关宏  -fPIC

位置无关代码段的优点:

1.简化设计,方便实现系统的快速引导。位置无关代码可以避免在引导时进行地址映射,并方便地跳转到RAM中实现快速引导

2.实现复位处理智能化。位置无关的代码可以被加载到任意地址空间运行

3.便于调试。Bootloader的调试通常也是一个繁琐的过程,使用位置无关代码,则可以将映像文件加载到RAM中进行调试,

这既能真实地反映程序从ROM中  进行系统引导的情况,又可以避免频繁烧写程序存储器。

linux 下cmake 编译 ,调用,调试 poco 1.6.0 小记

上篇文章 小记了: 关于 Poco::TCPServer框架 (windows 下使用的是 select模型) 学习笔记. http://www.cnblogs.com/bleachli/p/4352 ...

linux 下 VSCODE 使用CMake编译STM32程序

项目在做什么 项目地址 本项目是为了研究MCU在linux下开发而做的 --build 存放cmake编译生成的文件 --cmake 存放cmake编译时会用到的文件,比如工具链检查.编译选项等 -- ...

关于VS2015支持编译Linux程序的问题

现状 目前已经发布的VS2015中包括VS2015 Preview 以及 VS2015 CTP6,这两个版本均不支持直接编译C++代码为Linux程序,具体情况可以参考 Visual Studio 2 ...

使用VS+VisualGDB编译Linux版本RCF

RPC通信框架--RCF介绍中说了,RCF本身是支持跨平台的,其代码放到Linux平台,是可以通过gcc.make等工具,编译通过的. 官方提供的源码中,只有cmake编译脚本,并没有提供Makefi ...

使用VS+VisualGDB编译Linux版本RCF(相当于Linux也有COM版本了)

阅读目录 通过向导配置项目 配置目录结构 修改项目配置 添加RCF源代码 完成配置并进行编译 添加测试程序 添加测试代码——通过TCP进行通信 运行测试程序并查看测试结果 VisualGDB生成的所有 ...

CentOS_5.6下使用cmake编译MySQL_5.5.11

MySQL 最新的版本5.5.11需要cmake编译安装,估计以后的版本也会采用这种方式,网上找了一些安装方法有些地方是错的,自己整理一份 所以特地记录一下安装步骤及过程,以供参考!1 mysql 5 ...

CentOS_5.6下使用cmake编译MySQL_5.5.11教程

注:资料来自网络    Centos 5.6编译安装mysql 5.5.11 2011年06月24日 星期五 05:33 MySQL 最新的版本5.5.11需要cmake编译安装,估计以后的版本也会采 ...

Android开发学习之路--Android Studio cmake编译ffmpeg

最新的android studio2.2引入了cmake可以很好地实现ndk的编写.这里使用最新的方式,对于以前的android下的ndk编译什么的可以参考之前的文章:Android开发学习之路– ...

cmake编译opencv指南

目录 cmake编译opencv指南 用包管理器安装 查看opencv相关的包 执行安装 编译安装 为什么编译安装 下载源码 编译脚本 执行编译脚本.解决3rdparty下载 编译后的设定-环境变量 ...

随机推荐

archlinux中c语言的rpc编程

参考:http://www.cs.rutgers.edu/~pxk/rutgers/notes/rpc/ 启动rpc服务端会出现 unable to register 这个错误,据说是要启用 port ...

最小路径(prim)算法

#include #include /* 最小路径算法 -->prim算法 */#define VNUM 9#define MV 6 ...

KMP算法学习

kmp算法完成的任务是:给定两个字符串O和f,长度分别为n和m,判断f是否在O中出现,如果出现则返回出现的位置.常规方法是遍历a的每一个位置,然后从该位置开始和b进行匹配,但是这种方法的复杂度是O(n ...

DevExpress 12.1 换肤 超级简单的方法(2013-11-5版)

本例子是按照DevExpress 12.1 版本 进行演示.请先准备好DevExpress.BonusSkins.v12.1.dll 和DevExpress.Utils.v12.1.dll 1.首先添 ...

Java中关于继承、类、多态、接口的知识点

继承 含义:在面向对象编程中,可以通过扩展一个已有的类,并继承该类的属性和行为,来创建一个新的类 优点:1)代码的重用性:2)子类扩展父类的属性和方法:3)父类的属性和方法可用于子类:4)设计应用程序 ...

使用VsCode编写和调试.NET Core项目

​ 本来我还想介绍以下VSCode或者donet core,但是发现都是废话,没有必要,大家如果对这个不了解可以直接google这两个关键字,或者也根本不会看我这边文章. ​ 好直接进入主题了,本文的 ...

Win10系统的SurfacePro4如何重装系统-2 重装WIN10系统

把SurfacePro充好电,然后关机,开机按住音量+,然后再按电源键,可以开机并进入BIOS(此前应确保优盘已经装了PE并插入Surface)   然后选择U盘启动为第一个(按住之后把他拖放到第一位 ...

JavaWeb 之 清理错误的无奈之举

1. Project -> Clean 2. 清空浏览器缓存 (得先按了F2,出了调试窗口,才可以右键它) 3. 右键项目 -> Maven -> Update -> Forc ...

vs未能正确加载XXX包,编译时停止工作问题

出现这个问题的原因可能是配置更改或安装了另一个扩展,幸好之前用的不多,重新进行用户配置代价也不高,打开Visual Studio Tools:  选择VS2013 开发人员命令提示:  输入deven ...

C++11线程池的实现

什么是线程池 处理大量并发任务,一个请求一个线程来处理请求任务,大量的线程创建和销毁将过多的消耗系统资源,还增加了线程上下文切换开销. 线程池通过在系统中预先创建一定数量的线程,当任务请求到来时从线程 ...

你可能感兴趣的:(在linux上用cmake编译c,CMake编译linux C++)