原創 2023年12月16日 17:00:35
今天,mayuyu要向大家介紹乙個非常實用的工具,叫做gflags。gflags是google開源的一套命令列引數解析工具,比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
?#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...