ubuntu中CMake入門
1.首先安裝CMake
sudo apt-get install cmake
2.建立最簡單的cmake例子
1)開啟終端先建立一個資料夾
mkdir lab1
cd lab1
2)在lab1目錄下建立兩個檔案
touch main.cpp CMakeLists.txt
3)在main.cpp中寫入
#include <iostream>
int main(int argc,char** argv)
{
std::cout<<"hello"<<std::endl;
return 0;
}
- 在CMakeLists.txt中寫入
cmake_minimum_required (VERSION 2.8)#CMake 最低版本
project (Test01)#工程名稱
add_executable(test_01 main.cpp)#test_01是有main.cpp生成的可執行檔案
5)生成Makefile檔案
在lab1檔案目錄下
cmake .
make
3. 新增子專案
正常開發每個人會單獨開發自己的部分,所以需要將一個子專案加入主專案中
1)首先在lab1目錄下建立新的資料夾lab2,並新增三個檔案
mkdir lab2 cd lab2 touch SharePrint.h SharePrint.cpp CMakeLists.txt
2)在SharePrint.h中新增
void share_print(int id);
3)在SharePrint.cpp中新增
#include<iostream>
void share_print(int id){
std::cout<<id<<std::endl;
}
3)在lab2的CMakeLists.txt中加入
add_library(shareprint SharePrint.cpp)#就是為了生成libshareprint.a
4)修改lab1下的CMakeLists.txt
cmake_minimum_required (VERSION 2.8) project (Test01) add_subdirectory(lab2) set (EXTRA_LIBS ${EXTRA_LIBS} shareprint) add_executable(test_01 main.cpp) target_link_libraries(test_01 ${EXTRA_LIBS})
這裡其實簡單就是設定EXTRA_LIBS 為shareprint,然後講shareprint連結到test_01上
5)在lab1目錄下(這裡還沒說clean,自己手動刪除之前cmake和make產生的檔案)
cmake .
make
4.利用CMakeLists.txt生成標頭檔案
1)在lab1目錄下建立test.h.in檔案
touch test.h.in
2)在test.h.in中新增
#define CMAKE_VERSION_MAX @CMAKE_VERSION_MAX@
#define CMAKE_VERSION_MIN @CMAKE_VERSION_MIN@
這裡CMAKE_VERSION_MAX CMAKE_VERSION_MIN 是我隨便取得名字
@@ 中間的變數可以通過配置CMakeLists.txt來生成
3)在lab1下的main.cpp中改為
#include <iostream>
#include "lab2/SharePrint.h"
#include "test.h"
int main(int argc,char** argv)
{
std::cout<<"this aa"<<std::endl;
int id =2;
share_print(id);
std::cout<<"CMAKE_VERSION_MAX:"<<CMAKE_VERSION_MAX<<std::endl;
std::cout<<"CMAKE_VERSION_MIN:"<<CMAKE_VERSION_MIN<<std::endl;
return 0;
}
這裡只是簡單的添加了馬上要生成的test.h標頭檔案和對兩個巨集定義的變數的使用
4)修改lab1下面的CMakeLists.txt檔案
cmake_minimum_required (VERSION 2.8)
project (Test01)
set (PROJECT_SOURCE_DIR $HOME/workspace/lab1)
set (PROJECT_BINARY_DIR $HOME/workspace/lab1)
include_directories("${PROJECT_SOURCE_DIR}")
#設定兩個巨集定義變數的值
set(CMAKE_VERSION_MIN 2)
set(CMAKE_VERSION_MAX 3)
configure_file(
"${PROJECT_SOURCE_DIR}/test.h.in"#用於生成標頭檔案h.in檔案的位置
"${PROJECT_BINARY_DIR}/test.h"#生成的標頭檔案放在什麼地方
)
add_subdirectory(lab2)
set (EXTRA_LIBS ${EXTRA_LIBS} shareprint)
add_executable(test_01 main.cpp)
target_link_libraries(test_01 ${EXTRA_LIBS} )
5)在lab1目錄下(這裡還沒說道clean,自己手動刪除之前cmake和make產生的檔案)
cmake .
make
./test_01
5.判斷系統中是否存在某個函式
1)首先要使用CheckFunctionExists庫,呼叫裡面的check_function_exists函式
修改在lab1下的CMakeLists.txt
cmake_minimum_required (VERSION 2.8)
project (Test01)
include (CheckFunctionExists)
check_function_exists (cout HAVE_COUT)
set (PROJECT_SOURCE_DIR $HOME/workspace/lab1)
set (PROJECT_BINARY_DIR $HOME/workspace/lab1)
include_directories("${PROJECT_BINARY_DIR}")
set(CMAKE_VERSION_MIN 2)
set(CMAKE_VERSION_MAX 3)
configure_file(
"${PROJECT_SOURCE_DIR}/test.h.in"
"${PROJECT_BINARY_DIR}/test.h"
)
add_subdirectory(lab2)
set (EXTRA_LIBS ${EXTRA_LIBS} shareprint)
add_executable(test_01 main.cpp)
target_link_libraries(test_01 ${EXTRA_LIBS} )
2)修改test.h.in
#define CMAKE_VERSION_MAX @CMAKE_VERSION_MAX@
#define CMAKE_VERSION_MIN @CMAKE_VERSION_MIN@
#cmakedefine HAVE_COUT
#cmakedefine HAVE_COUT #的意思是如果系統有滿足CMakeLists.txt判斷函式的存在,就會在相應的標頭檔案中進行巨集定義
3)修改mian.cpp
#include <iostream>
#include "lab2/SharePrint.h"
#include "test.h"
int main(int argc,char** argv)
{
#ifdef HAVE_COUT
std::cout<<"this aa"<<std::endl;
#endif
int id =2;
share_print(id);
#ifdef HAVE_COUT
std::cout<<"CMAKE_VERSION_MAX:"<<CMAKE_VERSION_MAX<<std::endl;
std::cout<<"CMAKE_VERSION_MIN:"<<CMAKE_VERSION_MIN<<std::endl;
#endif
return 0;
}
- 在lab1下面(這裡還沒說clean,自己手動刪除之前cmake和make產生的檔案)
cmake .
make
./test_01
6. 利用option實現是否使用某個模組
1).在CMakeLists.txt中新增
option(
USE_SHARE_PRINT
"use libshareprint.a" ON)
這裡就是通過改變 ON或者OFF,預設不填為OFF
2)在test.h.in中新增
#cmakedefine USE_SHARE_PRINT
這裡如果選擇ON,生成的test.h檔案中就會有#define USE_SHARE_PRINT,否者就沒有
3)修改main.cpp
#ifdef USE_SHARE_PRINT
share_print(id);
#endif
- 在lab1下面(這裡還沒說道clean,自己手動刪除之前cmake和make產生的檔案)
cmake .
make
./test_01
就這樣可以實現選擇使用某個模組的程式碼