1. 程式人生 > 實用技巧 >ubuntu中CMake入門

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;
}
  1. 在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;
}
  1. 在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
  1. 在lab1下面(這裡還沒說道clean,自己手動刪除之前cmake和make產生的檔案)
cmake .
make 
./test_01 

就這樣可以實現選擇使用某個模組的程式碼