学习使用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

 

 

程序员常用的在线工具

程序员常看的技术网站

 

 

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值