讀caffe原始碼 gflags的使用

2021-08-15 05:48:27 字數 4646 閱讀 5430

原創 2023年12月16日 17:00:35

今天,mayuyu要向大家介紹乙個非常實用的工具,叫做gflagsgflagsgoogle開源的一套命令列引數解析工具,比getopt()函式功能要強大,使用起來更加方便,gflags還支援從環境變數和配置檔案中讀取引數。目前有c++python版本。本文就來詳細介紹c++版本gflags的使用,主要分如下兩個部分

contents

1. gflags的安裝

2. gflags的使用介紹

1. gflags的安裝

mayuyu的版本是gflags-1.0rc2.tar.gz,然後進行解壓,執行如下3

(1)./configure

(2)make

(3)make install

介紹兩個比較重要的檔案

doc:         gflags的幫助檔案,裡面介紹了gflags的一些使用方法。

src:         gflags的**原始檔。

為了程式在執行時能載入libgflags.so檔案,還需要在/usr/lib目錄下建立軟鏈結,如下

現在就徹底安裝好gflags了,可以安心使用。

2. gflags的使用介紹

(1)定義引數

使用gflags需要包含標頭檔案#include 。而gflags支援的引數型別有

define_bool:   boolean

define_int32:  32-bit integer

define_int64:  64-bit integer

define_uint64: unsigned 64-bit integer

define_double: double

define_string: c++ string

定義方式如下

define_type就可以了,該巨集的三個引數分別代表命令列引數名,引數預設值,引數的幫助資訊。

gflags不支援列表,但是可以借助string型別實現,比如

(2)引數訪問

引數被定義後,可以通過flags_name來訪問,比如

注意一點,通過define定義的引數,要保證訪問變數的檔案和定義引數的檔案是同乙個檔案或者是標頭檔案

包含關係,否則將會訪問不到定義的引數。在其它檔案使用定義的引數通過declare實現。

(3)引數檢查

引數定義後,可以為引數註冊乙個檢查函式,當從命令列指定引數或通過setcommandlineoption()指定

引數時,檢查函式就會被呼叫,兩個引數分別為命令列引數名,以及設定的引數值。

[cpp]view plain

copy

print

?#include 

#include 

#include 

#include 

#include 

using

namespace std;  

using

namespace google;  

static

bool validateport(const

char *flagname, int32_t val)  

define_int32(port, 6379, 」what is the port ?」);  

int main(int argc, char **argv)    

#include

using namespace std; using namespace google; static bool validateport(const char *flagname, int32_t val) define_int32(port, 6379, "what is the port ?"); int main(int argc, char **argv)

建議在定義引數後,立即註冊檢查函式。registerflagvalidator()在檢查函式註冊成功時返回true;

如果引數已經註冊了檢查函式,或者檢查函式型別不匹配,返回false。

(4)初始化引數

通過呼叫parsecommandlineflags(&argc, &argv, true)實現,最後乙個引數如果為true,gflags

會移除parse過的引數,如果為false則會保留。可能會對引數順序進行調整。

(5)在命令列指定引數

可以通過:–引數名=引數值來指定。例如下面**

[cpp]view plain

copy

print

?#include 

#include 

#include 

#include 

#include 

using

namespace std;  

using

namespace google;  

static

bool validateport(const

char *flagname, int32_t val)  

define_int32(port, 6379, 」what is the port ?」);  

define_string(ip, 」127.0.0.1」, 「my ip ?」);  

int main(int argc, char **argv)  

#include
using namespace std;

using namespace google;

static bool validateport(const char *flagname, int32_t val)

define_int32(port, 6379, 「what is the port ?」);

define_string(ip, 「127.0.0.1」, 「my ip ?」);

int main(int argc, char **argv)

引數可以通過下面方式指定,引數之間可以沒有順序。

(5)一些特殊的引數認識

–help

列印定義過的所有引數的幫助資訊

–version

列印版本資訊 通過google::setversionstring()指定

–nodefok

但命令列中出現沒有定義的引數時,並不退出(error-exit)

–fromenv

從環境變數讀取引數值 –fromenv=foo,bar表明要從環境變數讀取foo,bar兩個引數的值。通過

export flags_foo=***; export flags_bar=yyy 程式就可讀到foo,bar的值分別為***,yyy。

–tryfromenv

與–fromenv類似,當引數的沒有在環境變數定義時,不退出(fatal-exit)

–flagfile

從檔案讀取引數值,–flagfile=my.conf表明要從my.conf檔案讀取引數的值。在配置檔案中指定參

數值與在命令列方式類似,另外在flagfile裡可進一步通過–flagfile來包含其他的檔案。

Caffe原始碼 math functions 解析

math function 定義了caffe 中用到的一些矩陣操作和數值計算的一些函式,這裡以float型別為例做簡單的分析 template void caffe cpu gemm const cblas transpose transa,const cblas transpose transb,...

caffe原始碼解析

目錄目錄 簡單介紹 主要函式readprotofromtextfile 函式 writeprotototextfile 函式 readprotofrombinaryfile 函式 writeprototobinaryfile 函式 readimagetocvmat 函式 matchext 函式 cv...

caffe 分類原始碼解讀

首先,新建乙個classifier的c 類,其中標頭檔案classifier.h如下 其中,classifier函式 根據模型的配置檔案.prototxt,訓練好的模型檔案.caffemodel,建立模型,得到net 處理均值檔案,得到mean 讀入labels檔案,得到labels classif...