1. 程式人生 > >cmake簡單使用-生成庫

cmake簡單使用-生成庫

上一篇寫了個最最最簡單的cmake使用方式。這篇增加生成庫的內容。

在C++中,並不是所有的程式碼都會被編譯成可執行檔案。只有帶main()函式的檔案才會生成可執行檔案。而另外的很多程式碼只是想打包成一坨,以供其他程式呼叫(比如你寫了一個牛逼的雙色球預測函式,別人才不管你怎麼寫的,只要能呼叫就好了!!),這一坨就叫

根據C++我們知道,一個庫需要有標頭檔案和庫檔案。我們來寫一個簡單的庫:

標頭檔案為libHelloSLAM.h

//標頭檔案libHelloSLAM.h

#ifndef LIBHELLOSLAM_H_
#define LIBHELLOSLAM_H_

void printHello();

#endif

很簡單,標頭檔案只需要包含函式的宣告即可~

庫檔案為libHelloSLAM.cpp

//庫檔案libHelloSLAM.cpp

#include <iostream>
using namespace std;

void printHello()
{
    cout<<"Hello SLAM"<<endl;
}

也很簡單,提供了一個printHello()函式,如果你經常列印這句話的話,就不用每次都自己寫了,直接呼叫這個函式就好了。

好,庫寫完了,還需要呼叫庫的測試程式,也就是呼叫這個庫的可執行程式。
測試程式為useHello.cpp

//可執行程式useHello.cpp
#include "libHelloSLAM.h" int main( int argc, char** argv ) { printHello(); return 0; }

最後,程式都寫好了,既然我們要用cmake,那CmakeLists.txt必不可少!

# 宣告要求的 cmake 最低版本
cmake_minimum_required( VERSION 2.8 )

# 宣告一個 cmake 工程
project( HelloSLAM )

# 設定編譯模式為Debug模式
set( CMAKE_BUILD_TYPE "Debug" )

# 生成一個靜態庫,會生成一個libhello.a檔案
add_library( hello libHelloSLAM.cpp ) # 生成一個共享庫,會生成一個libhello_shared.so檔案 add_library( hello_shared SHARED libHelloSLAM.cpp ) # 生成可執行檔案useHello add_executable( useHello useHello.cpp ) # 將可執行程式連結到上庫檔案 target_link_libraries( useHello hello_shared )

這裡來看一下CmakeLists.txt,

add_library()指令會生成庫:
add_library( hello libHelloSLAM.cpp )生成靜態庫、
add_library( hello_shared SHARED libHelloSLAM.cpp )新增 SHARE 後,生成共享庫。

有了庫之後,需要連結,
target_link_libraries()指令將目標檔案連結到庫檔案上。
target_link_libraries( useHello hello_shared )這裡為連結到共享庫。

可以發現,add_開頭的指令,都會生成東西,add_library生成庫,add_executable生成可執行檔案。

OK,一切準備妥當,此時資料夾中是這樣的:
這裡寫圖片描述
沒啥問題,繼續我們就可以四步走戰略:

mkdir build
cd build
cmake ..
make

cmake..之後,我們看一下build資料夾中有什麼(原資料夾中只是多了個build資料夾,沒啥看頭):
這裡寫圖片描述
發現,cmake階段生成了幾個檔案,當然最重要的就是MakeFile,不過靜態庫.a檔案和共享庫.so此步並沒有生成。

好,繼續make
這裡寫圖片描述
我們需要的靜態庫libhello.a、共享庫libhello_shared.so、可執行檔案useHello都出來了!

執行useHello測試一下:
這裡寫圖片描述
OK~~~沒毛病!

從中我們能看到,cmake階段真的只是去生成makefile檔案,所有的編譯連結都是有了makefile之後,在make指令下完成的!!!