本文記錄學習使用CMake的過程。linux
安裝CMake請參考:
http://blog.csdn.net/alex_my/article/details/17310001
本文使用Win7X64, VS2012。
參考了這篇文章:
本文所用到的代碼已打包:
http://download.csdn.net/detail/alex_my/6904069
請耐心一行行的看下去!
目錄:
一、單個文件示例;
二、多個文件示例;
三、生成庫文件示例;
四、多個目錄示例;
五、指定輸出目錄示例;
六、編譯動態庫示例;
七、使用CMake生成sln項目;
0、一些信息:
SET 命令用於設置變量
ADD_EXECUTABLE 告訴工程生成一個可執行文件
ADD_LIBRARY 告訴工程生成一個庫文件
一、單個文件示例:
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。
二、多文件示例
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。
三、生成庫文件示例
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")
四、多個目錄示例
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命令用來指明頭文件所在路徑。
五、指定輸出目錄示例
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。
六、編譯動態庫示例
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;
七、使用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