cmake是一個跨平臺的安裝(編譯)工具,可以用簡單的語句來描述所有平臺的安裝(編譯過程)。他能夠輸出各種各樣的makefile或者project檔案,能測試編譯器所支援的c++特性。只是cmake的組態檔取名為cmakelists.txt。cmake並不直接建構出最終的軟體,而是產生標準的建構檔(如linux的makefile或windowsvisualc++的projects/workspaces),然後再依一般的建構方式使用。
在linux平臺下使用cmake生成makefile並編譯的流程如下:
編寫cmakelists.txt。
執行命令“cmakepath”或者“ccmakepath”生成makefile(path是cmakelists.txt所在的目錄)。
使用make命令進行編譯
工程例項:
一.編寫各層cmakelists.txt
主目錄的主程式main.cpp
#include"hello.h"
externhellohello;
intmain()
{
hello.print();
return0;
}
主目錄的cmakelists.txt
#totherootbinarydirectoryoftheprojectas${main_binary_dir}.
project(main)
#versionsupport
cmake_minimum_required(version2.8)
#recurseintothe"hello"and"demo"subdirectories.thisdoesnotactually
#causeanothercmakeexecutabletorun.thesameprocesswillwalkthrough
#theproject"sentiredirectorystructure.
add_subdirectory(hello)
add_subdirectory(demo)
#makesurethecompilercanfindincludefilesfromourhellolibrary.
include_directories(${main_source_dir}/hello)
#makesurethelinkercanfindthehellodemolibraryonceitisbuilt.
link_directories(${hello_binary_dir}/hello)
link_directories(${hello_binary_dir}/demo)
#definethesourcecoedesofcurrentdirectoryasdir_srcs
aux_source_directory(.dir_srcs)
#addexecutablecalled"main"thatisbuiltfromthesourcefiles
add_executable(main${dir_srcs})
#linktheexecutabletothehellodemolibrary.
target_link_libraries(mainhellodemo)
定義專案名project(main),使得當前目錄可以用${main_source_dir},由於有2個子目錄,所以需要add_subdirectory它們。由於主程式會使用到其他庫,因而也需要指定連線庫所在目錄。
主目錄下的作用是利用add_executable將當前目錄下的原始檔編譯成main程式,然後透過target_link_libraries連結hello和demo庫。由於主程式檔案使用了hello.h檔案,所以要include_directories該目錄。
---------------------------------------------------------------------------------------------------
子目錄demo的子程式demo.c
hellohello;
子目錄demo的cmakelists.txt
#definethesourcecoedesofcurrentdirectoryasdir_demo_srcs
aux_source_directory(.dir_demo_srcs)
#addlibrarycalled"demo"thatisbuiltfromthesourcefiles
add_library(demo${dir_demo_srcs})
demo目錄下的cmakelists主要作用是利用add_library將當前目錄原始碼編譯成demo庫,由於該庫使用到hello.h檔案,所以要include_directories該目錄。
子目錄hello的子程式hello.h
#ifndef_hello_h
#define_hello_h
classhello
public:
voidprint();
};
#endif
子目錄hello的子程式hello.c
#include
voidhello::print()
printf("hello,world!\n");
子目錄hello的cmakelists.txt
#definethesourcecoedesofcurrentdirectoryasdir_hello_srcs
aux_source_directory(.dir_hello_srcs)
#addlibrarycalled"hello"thatisbuiltfromthesourcefiles
add_library(hello${dir_hello_srcs})
hello目錄下的cmakelists主要作用是利用add_library將當前目錄原始碼編譯成hello庫。
二.執行cmake命令
至此我們完成了專案中所有cmakelists.txt檔案的編寫,進入目錄step2中依次執行命令
#cmake.
預設當前目錄,生產makefile
#make
最後編譯程式
cmake是一個跨平臺的安裝(編譯)工具,可以用簡單的語句來描述所有平臺的安裝(編譯過程)。他能夠輸出各種各樣的makefile或者project檔案,能測試編譯器所支援的c++特性。只是cmake的組態檔取名為cmakelists.txt。cmake並不直接建構出最終的軟體,而是產生標準的建構檔(如linux的makefile或windowsvisualc++的projects/workspaces),然後再依一般的建構方式使用。
在linux平臺下使用cmake生成makefile並編譯的流程如下:
編寫cmakelists.txt。
執行命令“cmakepath”或者“ccmakepath”生成makefile(path是cmakelists.txt所在的目錄)。
使用make命令進行編譯
工程例項:
一.編寫各層cmakelists.txt
主目錄的主程式main.cpp
#include"hello.h"
externhellohello;
intmain()
{
hello.print();
return0;
}
主目錄的cmakelists.txt
#totherootbinarydirectoryoftheprojectas${main_binary_dir}.
project(main)
#versionsupport
cmake_minimum_required(version2.8)
#recurseintothe"hello"and"demo"subdirectories.thisdoesnotactually
#causeanothercmakeexecutabletorun.thesameprocesswillwalkthrough
#theproject"sentiredirectorystructure.
add_subdirectory(hello)
add_subdirectory(demo)
#makesurethecompilercanfindincludefilesfromourhellolibrary.
include_directories(${main_source_dir}/hello)
#makesurethelinkercanfindthehellodemolibraryonceitisbuilt.
link_directories(${hello_binary_dir}/hello)
link_directories(${hello_binary_dir}/demo)
#definethesourcecoedesofcurrentdirectoryasdir_srcs
aux_source_directory(.dir_srcs)
#addexecutablecalled"main"thatisbuiltfromthesourcefiles
add_executable(main${dir_srcs})
#linktheexecutabletothehellodemolibrary.
target_link_libraries(mainhellodemo)
定義專案名project(main),使得當前目錄可以用${main_source_dir},由於有2個子目錄,所以需要add_subdirectory它們。由於主程式會使用到其他庫,因而也需要指定連線庫所在目錄。
主目錄下的作用是利用add_executable將當前目錄下的原始檔編譯成main程式,然後透過target_link_libraries連結hello和demo庫。由於主程式檔案使用了hello.h檔案,所以要include_directories該目錄。
---------------------------------------------------------------------------------------------------
子目錄demo的子程式demo.c
#include"hello.h"
hellohello;
子目錄demo的cmakelists.txt
#makesurethecompilercanfindincludefilesfromourhellolibrary.
include_directories(${main_source_dir}/hello)
#definethesourcecoedesofcurrentdirectoryasdir_demo_srcs
aux_source_directory(.dir_demo_srcs)
#addlibrarycalled"demo"thatisbuiltfromthesourcefiles
add_library(demo${dir_demo_srcs})
demo目錄下的cmakelists主要作用是利用add_library將當前目錄原始碼編譯成demo庫,由於該庫使用到hello.h檔案,所以要include_directories該目錄。
---------------------------------------------------------------------------------------------------
子目錄hello的子程式hello.h
#ifndef_hello_h
#define_hello_h
classhello
{
public:
voidprint();
};
#endif
子目錄hello的子程式hello.c
#include"hello.h"
#include
voidhello::print()
{
printf("hello,world!\n");
}
子目錄hello的cmakelists.txt
#definethesourcecoedesofcurrentdirectoryasdir_hello_srcs
aux_source_directory(.dir_hello_srcs)
#addlibrarycalled"hello"thatisbuiltfromthesourcefiles
add_library(hello${dir_hello_srcs})
hello目錄下的cmakelists主要作用是利用add_library將當前目錄原始碼編譯成hello庫。
---------------------------------------------------------------------------------------------------
二.執行cmake命令
至此我們完成了專案中所有cmakelists.txt檔案的編寫,進入目錄step2中依次執行命令
#cmake.
預設當前目錄,生產makefile
#make
最後編譯程式