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指令下完成的!!!