学习使用CMake构建工程

本文记录学习使用CMake的过程。

安装CMake请参考:

http://blog.csdn.net/alex_my/article/details/17310001

本文使用Win7X64, VS2012。

参考了这篇文章:

http://blog.csdn.net/fan_hai_ping/article/details/8208898

本文所用到的代码已打包:

http://download.csdn.net/detail/alex_my/6904069

请耐心一行行的看下去!


目录:

1、单个文件示例;

2、多个文件示例;

3、生成库文件示例;

4、多个目录示例;

5、指定输出目录示例;

6、编译动态库示例;

7、使用CMake生成sln项目;


0、一些信息:

SET 命令用于设置变量

ADD_EXECUTABLE 告诉工程生成一个可执行文件

ADD_LIBRARY 告诉工程生成一个库文件


1、单个文件示例:

1) 首先建立文件夹CMakeTest/Src

2) 在文件夹Src中建立两个文件main.c和CMakeLists.txt

3) main.c:

#include <stdio.h>

int main()
{
     printf("hello world.");
     getchar();
     return 0;
}

4) CMakeLists.txt

PROJECT (HELLO)

SET (SRC_LIST main.c)

ADD_EXECUTABLE (hello ${SRC_LIST})

5) 打开:开始--Microsoft Visual Studio 2012--Visual Studio Tools--VS2012 x86 Native Tools Command Prompt

6) 进入到CMakeTest/build/Src目录,执行以下代码

mkdir build & cdbuild

cmake .. -G"NMake Makefiles"

nmake

运行结果如下两张图:

# 插入图片cmake_step11.png

# 插入图片cmake_step12.png

7) Src/build下生成hello.exe。

2、多文件示例

1) 建立文件夹CMakeTest/Src2

2) 在文件夹Src2中建立三个文件:main.c, hello.h, hello.c

3) hello.h

#ifndef __SRC2_HELLO_H__
#define __SRC2_HELLO_H__

void Hello2(const char* text);

#endif // __SRC2_HELLO_H__

4) hello.c

#include "hello.h"
#include <stdio.h>

void Hello2(const char* text)
{
   if(text)
       printf("Hello %s!\n", text);
}

5) main.c

#include "hello.h"

int main()
{
     Hello2("Alex");

getchar();
     return 0;
};

6) CMakeLists.txt

PROJECT (HELLO)

SET (SRC_LIST main.c hello.c)

ADD_EXECUTABLE (hello ${SRC_LIST})

7) 通过VS2012 x86 Native Tools Command Prompt 进入到Src3,执行与1 相同的代码:

mkdir build & cdbuild

cmake .. -G"NMake Makefiles"

nmake

8) Src3/build下生成hello.exe。

3、生成库文件示例

1) 建立文件夹CMakeTest/Src3。

2) 将Src2目录下的hello.c, hello.h, main.c, CMakeLists.txt复制到Src3中。

3) 修改CMakeLists.txt

PROJECT (HELLO)

SET (SRC_LIBHELLO hello.c)

SET (SRC_APP main.c)

ADD_LIBRARY (libhello ${SRC_LIBHELLO})

ADD_EXECUTABLE (hello ${SRC_APP})

TARGET_LINK_LIBRARIES(hello libhello)

4) 通过VS2012 x86 Native Tools Command Prompt 进入到Src3,执行与1 相同的代码:

mkdir build & cdbuild

cmake .. -G"NMake Makefiles"

nmake

5) Src3/build下生成hello.exe。

6) 如果想指定生成库的名称,可以添加一句:

SET_TARGET_PROPERTIES(libhello PROPERTIES OUTPUT_NAME "hello")

4、多个目录示例

1) 建立文件夹CMakeTest/Src4,在Src4中建立文件夹lib和src。

2) 将Src2中的hello.h, hello.c复制到Src4/lib中。

3) 将Src2中的main.c复制到Src4/src中。

4) 在Src4根目录下新建文件CMakeLists.txt。

内容:

PROJECT (HELLO)

ADD_SUBDIRECTORY (src)

ADD_SUBDIRECTORY (lib)

5) 在Src4/lib中新建文件CMakeLists.txt。

内容:

CMAKE_MINIMUM_REQUIRED (VERSION 2.8)

SET (SRC_LIB hello.c)

ADD_LIBRARY(libhello ${SRC_LIB})

6) 在Src4/src中新建问价CMakeLists.txt。

内容:

CMAKE_MINIMUM_REQUIRED (VERSION 2.8)

INCLUDE_DIRECTORIES (${PROJECT_SOURCE_DIR}/lib)

SET (SRC_APP main.c)

ADD_EXECUTABLE (hello ${SRC_APP})

TARGET_LINK_LIBRARIES (hello libhello)

7) 通过VS2012 x86 Native Tools Command Prompt 进入到Src4,执行与1 相同的代码:

mkdir build & cdbuild

cmake .. -G"NMake Makefiles"

nmake

8) Src4/build下生成hello.exe。

9) ADD_SUBDIRECTORY命令告诉CMake去子目录中查找可用的CMakeLists.txt文件。

INCLUDE_DIRECTORIES命令用来指明头文件所在路径。

5、指定输出目录示例

1) 将执行文件和库文件输出到指定文件中。二者可以存放到不同的目录下,也可以存放到相同的

目录下,本文存放到相同的目录下。

2) 新建文件夹CMakeTest/Src5。

3) 将Src4中的内容除build之外复制到Src5中。

4)修改Src5/lib中的CMakeLists.txt。

CMAKE_MINIMUM_REQUIRED (VERSION 2.8)

SET (SRC_LIB hello.c)

ADD_LIBRARY(libhello ${SRC_LIB})

# 添加以下这句,注意/bin要与"}"紧贴,bin文件夹如果不存在,会自动创建。
SET (LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

5)修改Src5/src中的CMakeLists.txt。

CMAKE_MINIMUM_REQUIRED (VERSION 2.8)

INCLUDE_DIRECTORIES (${PROJECT_SOURCE_DIR}/lib)

SET (SRC_APP main.c)

# 添加这句,将lib存放到与执行文件相同的目录下,也可以存放到不同目录。
SET (EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

ADD_EXECUTABLE (hello ${SRC_APP})

TARGET_LINK_LIBRARIES (hello libhello)

6) 通过VS2012 x86 Native Tools Command Prompt 进入到Src5,执行与1 相同的代码:

mkdir build & cdbuild

cmake .. -G"NMake Makefiles"

nmake

7) Src5/build/bin下生成hello.exe。

6、编译动态库示例

1) 新建文件夹CMakeTest/Src6。

2) 将Src5中的内容除build之外复制到Src6中。

3) 修改Src6/lib文件夹中的hello.h

内容:

#ifndef __HELLO_H__
#define __HELLO_H__

#ifdef WIN32

#if LIBHELLO_BUILD
#define LIBHELLO_API __declspec(dllexport)
#else
#define LIBHELLO_API __declspec(dllimport)
#endif // #ifdef LIBHELLO_BUILD

#else
#define LIBHELLO_API
#endif // #ifdef WIN32

LIBHELLO_API void Hello2(const char* text);

#endif // __HELLO_H__

7) 修改Src6/lib文件夹中的CMakeLists.txt

内容:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

SET(SRC_LIB hello.c)

ADD_DEFINITIONS("-DLIBHELLO_BUILD")

ADD_LIBRARY(libhello SHARED ${SRC_LIB})

SET(LIBRARY_OUTPUT_PATH${PROJECT_BINARY_DIR}/bin)

8) 通过VS2012 x86 Native Tools Command Prompt 进入到Src6,执行与1 相同的代码:

mkdir build & cdbuild

cmake .. -G"NMake Makefiles"

nmake

9) Src6/build/bin下生成hello.exe。将Src6/build/lib下的libhello.dll和libhello.lib拷贝到bin目录,运行hello.exe;

7、使用CMake生成sln项目

1) 以上是一些基本应用,现在我们将要生成sln项目供VS直接使用,当然,也可以生成供XCODE使用或者linux等等。

2) 本机配置:WIN7 X64,VS2012 X64。本次使用CMakeTest/Src5做为示例。

3) 运行CMake, 将Src5包含在源文件中,在Src5下新建build目录(也可以先不建,会自动生成),将其包含到生成文件中。

如图:

# 配图 cmake_step71.png

4) 运行上图中红框指示的Configure按钮,在弹出框中选择Visual Studio 11 WIN64(根据你的需要进行选择,注意的是VS2012 对应

的版本号是110,因此选11, VS2010 对应的版本号是100,因此选10)。点击下图中红框指示的Finish按钮。

# 配图 cmake_step72.png

5) 运行结束后如下图所示,如果有错误,会在红框指示区提示。请再次点击 Configure按钮。

# 配图 cmake_step73.png

6) 运行结束后如下图所示, 然后请点击Generate按钮。

# 配图 cmake_step74.png

7) 打开CMakeTest/Src5/build,会发现生成的HELLO.sln。

# 配图 cmake_step75.png

8) 用VS2012将项目打开,选择ALL_BUILD为启动项,编译。

# 配图 cmake_step76.png

学习使用CMake构建工程

时间: 2024-11-05 02:17:32

学习使用CMake构建工程的相关文章

cmake 构建工程

说明:文章参照<CMAKE实践> 1.首先创建工程目录:/learn/cmake/project project目录中需要编写CMakeLists.txt 2.在project中创建src子目录: 放置工程源代码 src目录中需要编写CMakeLists.txt 3.在project中创建build子目录: 编译目录,外部编译时,(cmake .. )生成得编译需要的Makefile以及其他的中间文件,会在这个目录中, (make)生成的目标文件 target 会在 build/bin 目录中

CMake命令:CMake构建系统的骨架

CMake命令:CMake构建系统的骨架 80个命令(转载自http://www.cnblogs.com/coderfenghc/archive/2012/06/16/CMake_ch_01.html#2996205) CMD#1: add_custom_command为生成的构建系统添加一条自定义的构建规则. add_custom_command命令有两种主要的功能:第一种是为了生成输出文件,添加一条自定义命令. add_custom_command(OUTPUT output1 [outpu

CMake构建NDK项目提示asm/types.h找不到

用CMake构建NDK项目时,会传入toolchain的cmake脚本文件android.toolchain.cmake给CMake.这个文件中会做若干设定,其中就包括include路径. 我遇到的情况是,自己手动修改CMAKE_C_FLAGS和CMAKE_CXX_FLAGS时,覆盖了它们原有的(android.toolchain.cmake修改后的)值,导致asm/types.h找不到. 我的错误设定: set(CMAKE_C_FLAGS "${MY_CMAKE_C_FLAGS}")

CMake VS工程总结

1.设置输出后缀 set(CMAKE_DEBUG_POSTFIX "d") 2.设置输出目录 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) 3.设置文件虚拟目录 SOURCE_GR

淘淘商城系列——使用maven构建工程

开发工具和环境 这里,我统一规范一下淘淘商城的开发工具和环境,如下: Eclipse 4.5.2(Mars2),其自带maven插件,需要手工安装svn插件,但我提供的这个eclipse,svn插件已经搭好了 Maven-3.3.9(开发工具自带) Tomcat-7.0.75(Maven Tomcat Plugin) JDK 1.7 MySQL 5.7.17 Nginx 1.8.0 Redis 3.0.0 Win10 操作系统 SVN(版本管理工具) 工程搭建 使用maven的好处 项目构建.M

Java开发技巧:如何利用Ant手动构建工程

利用Java语言构建工程,在这过程中主要是编译.打包.运行.部署等操作.将工程中的一个src文件夹用来放置工程的源代码,其中只有一个类的源代码. 在HelloWorld中新建HelloWorld.java代码如下: public class HelloWorld{ public static void main(String[] args){ System.out.println("Hello World!"); } } 在没有使用Ant之前,先采用手工的方式来构建这个HelloWor

特征工程学习01-sklearn单机特征工程

特征工程学习01-sklearn单机特征工程 小书匠 kindle 0.数据的导入 from sklearn.datasets import load_iris #导入IRIS数据集  iris=load_iris()  #特征矩阵  print(iris.data[:5],len(iris.data))  #目标向量  print(iris.target[:5],len(iris.target))  [[ 5.1 3.5 1.4 0.2] [ 4.9 3. 1.4 0.2]  [ 4.7 3.

基于automake构建工程

在Linux平台,几乎所有工程都是基于Makefile进行编译的,在小型项目中,你可以手写Makefile,但是大型工程,手写Makefile处理起来很复杂,因此就需要使用automake进行构建工程 1.autoscan (autoconf): 扫描源代码以搜寻普通的可移植性问题,比如检查编译器,库,头文件等,生成文件configure.scan,它是configure.ac的一个雏形.然后直接将configure.scan该名为configure.ac,并编辑:configure.ac 2.

使用CMake构建复杂工程

0. 什么是CMake CMake是一个跨平台的编译.安装.测试以及打包工具:CMake不直接编译软件,而是结合原生构建系统来构建软件.CMake配置文件是CMakeList.txt文件(每个源码文件夹下都要有一个),CMake根据配置文件在生成Unix的Makefile或VS的solution文件等. 1. 为什么选CMake 别人为什么选CMake我不清楚,我是因为在Linux上直接写Makefile太痛苦,而项目又会跨平台,Windows和Linux都要有 2. 用一个简单工程来说明CMa