1. 程式人生 > >學習使用CMake構建工程

學習使用CMake構建工程

本文記錄學習使用CMake的過程。 安裝CMake請參考: http://blog.csdn.net/alex_my/article/details/17310001 本文使用Win7X64, VS2012。 參考了這篇文章: 本文所用到的程式碼已打包: 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