當前位置:首頁 » 編程軟體 » glog編譯so

glog編譯so

發布時間: 2023-03-26 21:03:53

linux下無cuda怎麼pip安裝pytorch

linux下安裝caffe(無cuda)以及python介面
caffe(8)
主要過程稍微記錄一下:
1.安裝BLAS
sudo apt-get install libatlas-base-dev

2.安裝依賴項
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev protobuf-compiler liblmdb-dev
3.安裝glog
這個要FQ,我放在我的網路雲上了。
tar zxvf glog-0.3.3.tar.gz
cd glog-0.3.3
./configure
make
sudo make install

4.安裝gflags

wget https://github.com/schuhschuh/gflags/archive/master.zip
unzip master.zip
cd gflags-master
mkdir build && cd build
export CXXFLAGS="-fPIC" && cmake .. && make VERBOSE=1
make
sudo make install

這一步需要cmake,如果沒有安裝可以用 sudo apt-get install cmake 安裝。
5.安裝lmdb
git clone https://gitorious.org/mdb/mdb.git
cd mdb/libraries/liblmdb
make
sudo make install

如果沒有安裝Git,也要用 sudo apt-get install git 來安裝。
註:如果可以FQ,只用下面一句就可以安裝gflags,glog和lmdb了,省了3,4,5這三步。
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler

6.下載Caffe
git clone git://github.com/BVLC/caffe.git

7.安裝Caffe
cd caffe
cp Makefile.config.example Makefile.config

因為這里沒有gpu,所以需要設置Makefile.config文件中的CPU_ONLY:= 1,把這句的注釋去掉就可以了。
然後編譯
make all
make test
make runtest

安裝好以後我們就可以試著在mnist上跑一下lenet了。
1.首先獲取mnist數據
cd caffe
./data/mnist/get_mnist.sh

2.然後創建lenet
./examples/mnist/create_mnist.sh

注意一定要在caffe的根目錄下運行以下命令,否則會報「 build/examples/mnist/convert_mnist_data.bin: not found」的錯誤,參見這里。
3.訓練cnn
沒有gpu的話要記得把caffe/examples/mnist/lenet_solver.prototxt中的solver_mode設置成solver_mode: CPU。然後在根目錄下執行:
./examples/mnist/train_lenet.sh

准確率可以達到0.9912

因為caffe的tutorial上有很大一部分是Python的,所以後來又安裝了一下python的介面。
1.首先安裝python
2.安裝pip
sudo apt-get install python-pip python-dev build-essential

3.運行以下代碼安裝必要的依賴項:
sudo pip install -r ./python/requirements.txt

4.這里我運行了make clean以及其他編譯的caffe的命令,重新編譯了一次caffe,但我不確定是不是必須的。
5.在caffe的根目錄下運行:
make pycaffe

這里遇到了一個問題:
virtual memory exhausted: Cannot allocate memory
make: *** [python/caffe/_caffe.so] Error 1

按照這里的方法增加Linux虛擬機的內存就可以解決了。
6.把caffe/python的路徑加到python路徑中:
運行python進入python shell,然後運行下列命令:
import sys
sys.path.append("path/to/caffe/python/")
exit()

7. 這時候再次進入python shell,運行import caffe就沒有報錯了。

② 如何使用Google日誌庫

如何使用Google日誌庫 (glog)

介紹
Google glog是一個應用層的庫. 它提供基於C++風格的流和多種宏介面.例如:
#include <glog/logging.h>

int main(int argc, char* argv[]) {
// Initialize Google's logging library.
google::InitGoogleLogging(argv[0]);

// ...
LOG(INFO) << "Found " << num_cookies << " cookies";
}
Google glog定義了一系列的宏處理普通的日誌工作. 你可以分級記錄, control loggingbehavior from the command line, 按條件記錄, abort theprogram when expected conditions are not met, introce your ownverbose logging levels, 及其它. 文本只是簡單的介紹了常用的glog功能而不是所有的細節.沒介紹到的,自己讀代碼去吧.

嚴重等級
嚴重等級包括(按嚴重程度排序): INFO, WARNING,ERROR,和FATAL.記錄一個FATAL級的錯誤後會自動終止程序執行(其實就是_asm int 3).一個嚴重等級高的記錄不但記錄在它自己的文件,也記錄在比它低等的文件里.例滑態態如, 一個FATAL級的記錄將會記在FATAL, ERROR,WARNING, 和INFO等級的日誌里.
在debug狀態下FATAL級記錄也可以用DFATAL(當沒定義NDEBUG宏的時候),發給客戶的程序最好不要用FATAL小心客戶對你使用_asm int 3,這時ERROR是個不錯的選擇.
glog默認把日誌文件命名為"/tmp/...log...."(例如, "/tmp/hello_world.example.com.hamaji.log.INFO.20080709-222411.10474").glog默認把ERROR 和 FATAL 級的記錄發送一份到stderr.

設置標志
標志可以改變glog的輸出行為.如果你安裝了Googlegflags library, configure 腳本 (具體請參考它的INSTALL文件)會自動檢測並使用標信源志,這時你可以通過命令行使用標志.例如, 若你想發送 --logtostderr 標志,像下面這樣:
./your_application --logtostderr=1
如果你沒裝Google gflags library,你就只能用帶GLOG_的環境變數實現,例如.
GLOG_logtostderr=1 ./your_application (貌似在Windows里不能這樣用吧?)
常用的標志有:
logtostderr (bool, default=false)
寫日誌到stderr而不是日誌文件.
Note: you can set binary flags to true by specifying1, true, or yes (caseinsensitive).Also, you can set binary flags to false by specifying0, false, or no (again, caseinsensitive).

stderrthreshold (int, default=2, whichis ERROR)
將某級及以上級別的記錄同時發送到stderr和日誌文件. 嚴重等級INFO, WARNING, ERROR, FATAL 分別對應 0, 1, 2, 3.

minloglevel (int, default=0, whichis INFO)
只閉物記錄某級及以上級別的記錄.

log_dir (string, default="")
指定日誌保存的目錄.

v (int, default=0)
Show all VLOG(m) messages for m less orequal the value of this flag. Overridable by --vmole.See the section about verbose logging for moredetail.

vmole (string, default="")
Per-mole verbose level. The argument has to contain acomma-separated list of =.is a glob pattern (e.g., gfs* for all moles whose namestarts with "gfs"), matched against the filename base(that is, name ignoring .cc/.h./-inl.h). overrides any value given by --v.See also the section about verbose logging.
還有一些其它的標志,自己去logging.cc裡面搜索"DEFINE_",爺就不多說了.

你也可以在程序里修改FLAGS_* 開頭的全局變數. 通常設置FLAGS_*開頭的變數會立即生效,和日誌文件名或路徑相關的變數例外.例如FLAGS_log_dir就不能放在google::InitGoogleLogging後面.例子代碼:
LOG(INFO) << "file";
// Most flags work immediately after updating values.
FLAGS_logtostderr = 1;
LOG(INFO) << "stderr";
FLAGS_logtostderr = 0;
// This won't change the log destination. If you want to set this
// value, you should do this before google::InitGoogleLogging .
FLAGS_log_dir = "/some/log/directory";
LOG(INFO) << "the same file";
條件/ Occasional Logging
下面的宏用於根據條件寫日誌:
LOG_IF(INFO, num_cookies > 10) << "Got lots of cookies";
只有當num_cookies > 10的時候才會記錄"Got lots of cookies"
如果有的代碼執行非常頻繁,你肯定不會希望每次都寫入日誌.這時,你可以使用下面的方法:
LOG_EVERY_N(INFO, 10) < Got the googleCOUNTER th cookiepre>
上面的代碼只有當第1次,第11次,第21次....執行時才寫入日誌.Note that the specialgoogle::COUNTER value is used to identify which repetition ishappening.
條件和計次可以混合使用,例如:
LOG_IF_EVERY_N(INFO, (size > 1024), 10) << "Got the " << google::COUNTER
<< "th big cookie";
除了間隔N次輸出,還可以只輸出前M次,例如:
LOG_FIRST_N(INFO, 20) < Got the googleCOUNTER th cookiepre>
只輸出前20次.

Debug mode支持
"debug mode"的宏只在調試模式有效,其他模式不生效.上栗子:
DLOG(INFO) << "Found cookies";

DLOG_IF(INFO, num_cookies > 10) << "Got lots of cookies";

DLOG_EVERY_N(INFO, 10) << "Got the " << google::COUNTER << "th cookie";
CHECK宏
經常檢查是否會出錯而不是等著程序執行出錯是個不錯的習慣.CHECK宏就是干這個滴,它的功能和assert一樣,條件不符合時終止程序.
與assert不同的是它*不*受NDEBUG的限制,無論是不是debug編譯它都執行.所以下面的fp-<Write(x)會被執行:
CHECK(fp->Write(x) == 4) << "Write failed!";
有各種各樣的宏用於CHECK相等/不相等,包括: CHECK_EQ,CHECK_NE, CHECK_LE, CHECK_LT,CHECK_GE,和CHECK_GT.它們會記錄一個FATAL級的記錄到日誌,牛X的是他們還會把對比的兩個值也一起記錄.(那兩個值必須定義了 operator< ostreamcode> ).例如:
CHECK_NE(1, 2) << ": The world must be ending!";
We are very careful to ensure that each argument is evaluated exactlyonce, and that anything which is legal to pass as a function argument islegal here. In particular, the arguments may be temporary expressionswhich will end up being destroyed at the end of the apparent statement,for example:
CHECK_EQ(string("abc")[1], 'b');
The compiler reports an error if one of the arguments is apointer and the other is NULL. To work around this, simply static_castNULL to the type of the desired pointer.
CHECK_EQ(some_ptr, static_cast(NULL));
還有個好辦法:用CHECK_NOTNULL宏:
CHECK_NOTNULL(some_ptr); some_ptr-<DoSomething();
這宏也常用於構造函數中.
struct S {
S(Something* ptr) : ptr_(CHECK_NOTNULL(ptr)) {}
Something* ptr_;
};
這宏的缺點是不能跟C++流一起用.這時就得用CHECK_EQ了.
如果你要對比一個C字元串(char *)可以用:CHECK_STREQ, CHECK_STRNE,CHECK_STRCASEEQ,和CHECK_STRCASENE.帶CASE的區分大小寫. 這個宏參數可以用NULL指針.NULL與non-NULL比不等.兩個NULL是相等的.
Note that both arguments may be temporary strings which aredestructed at the end of the current "full expression"(e.g., CHECK_STREQ(Foo().c_str(), Bar().c_str()) whereFoo and Bar return C++'sstd::string).
CHECK_DOUBLE_EQ 用於對比浮點數,會有小小的誤差.CHECK_NEAR 可以接受一個浮點數作為誤差.
詳細日誌
用VLOG宏,你還可以定義自己的嚴重等級. The --v command line option controlswhich verbose messages are logged:
VLOG(1) << "I'm printed when you run the program with --v=1 or higher";
VLOG(2) << "I'm printed when you run the program with --v=2 or higher";
With VLOG, the lower the verbose level, the morelikely messages are to be logged. For example, if--v==1, VLOG(1) will log, butVLOG(2) will not log. This is opposite of the severitylevel, where INFO is 0, and ERROR is 2.--minloglevel of 1 will log WARNING andabove. Though you can specify any integers for both VLOGmacro and --v flag, the common values for them are smallpositive integers. For example, if you write VLOG(0),you should specify --v=-1 or lower to silence it. Thisis less useful since we may not want verbose logs by default in mostcases. The VLOG macros always log at theINFO log level (when they log at all).
Verbose logging can be controlled from the command line on aper-mole basis:
--vmole=maprece=2,file=1,gfs*=3 --v=0
will:
a. Print VLOG(2) and lower messages from maprece.{h,cc}
b. Print VLOG(1) and lower messages from file.{h,cc}
c. Print VLOG(3) and lower messages from files prefixed with "gfs"
d. Print VLOG(0) and lower messages from elsewhere
The wildcarding functionality shown by (c) supports both '*'(matches 0 or more characters) and '?' (matches any single character)wildcards. Please also check the section about command line flags.
There's also VLOG_IS_ON(n) "verbose level" conditionmacro. This macro returns true when the --v is equal orgreater than n. To be used as
if (VLOG_IS_ON(2)) {
// do some logging preparation and logging
// that can't be accomplished with just VLOG(2) << ...;
}
Verbose level condition macros VLOG_IF,VLOG_EVERY_N and VLOG_IF_EVERY_N behaveanalogous to LOG_IF, LOG_EVERY_N,LOF_IF_EVERY, but accept a numeric verbosity level asopposed to a severity level.
VLOG_IF(1, (size > 1024))
<< "I'm printed when size is more than 1024 and when you run the "
"program with --v=1 or more";
VLOG_EVERY_N(1, 10)
<< "I'm printed every 10th occurrence, and when you run the program "
"with --v=1 or more. Present occurence is " << google::COUNTER;
VLOG_IF_EVERY_N(1, (size > 1024), 10)
<< "I'm printed on every 10th occurence of case when size is more "
" than 1024, when you run the program with --v=1 or more. ";
"Present occurence is " << google::COUNTER;
Failure Signal Handler
The library provides a convenient signal handler that will mp usefulinformation when the program crashes on certain signals such as SIGSEGV.The signal handler can be installed bygoogle::InstallFailureSignalHandler(). The following is an example of outputfrom the signal handler.
*** Aborted at 1225095260 (unix time) try "date -d @1225095260" if you are using GNU date ***
*** SIGSEGV (@0x0) received by PID 17711 (TID 0x7f893090a6f0) from PID 0; stack trace: ***
PC: @ 0x412eb1 TestWaitingLogSink::send()
@ 0x7f892fb417d0 (unknown)
@ 0x412eb1 TestWaitingLogSink::send()
@ 0x7f89304f7f06 google::LogMessage::SendToLog()
@ 0x7f89304f35af google::LogMessage::Flush()
@ 0x7f89304f3739 google::LogMessage::~LogMessage()
@ 0x408cf4 TestLogSinkWaitTillSent()
@ 0x4115de main
@ 0x7f892f7ef1c4 (unknown)
@ 0x4046f9 (unknown)
By default, the signal handler writes the failure mp to the standarderror. You can customize the destination by InstallFailureWriter().
Miscellaneous Notes
Performance of Messages
The conditional logging macros provided by glog (e.g.,CHECK, LOG_IF, VLOG, ...) arecarefully implemented and don't execute the right hand sideexpressions when the conditions are false. So, the following checkmay not sacrifice the performance of your application.
CHECK(obj.ok) << obj.();
User-defined Failure Function
FATAL severity level messages or unsatisfiedCHECK condition terminate your program. You can changethe behavior of the termination byInstallFailureFunction.
void YourFailureFunction() {
// Reports something...
exit(1);
}

int main(int argc, char* argv[]) {
google::InstallFailureFunction(&YourFailureFunction);
}
By default, glog tries to mp stacktrace and makes the programexit with status 1. The stacktrace is proced only when you run theprogram on an architecture for which glog supports stack tracing (asof September 2008, glog supports stack tracing for x86 and x86_64).
Raw Logging
The header file can beused for thread-safe logging, which does not allocate any memory oracquire any locks. Therefore, the macros defined in thisheader file can be used by low-level memory allocation andsynchronization code.Please check src/glog/raw_logging.h.in for detail.
Google Style perror()
PLOG() and PLOG_IF() andPCHECK() behave exactly like their LOG* andCHECK equivalents with the addition that they append adescription of the current state of errno to their output lines.E.g.
PCHECK(write(1, NULL, 2) <= 0) < Write NULL failedpre>
This check fails with the following error message.
F0825 185142 test.cc:22] Check failed: write(1, NULL, 2) <= 0 Write NULL failed: Bad address [14]
Syslog
SYSLOG, SYSLOG_IF, andSYSLOG_EVERY_N macros are available.These log to syslog in addition to the normal logs. Be aware thatlogging to syslog can drastically impact performance, especially ifsyslog is configured for remote logging! Make sure you understand theimplications of outputting to syslog before you use these macros. Ingeneral, it's wise to use these macros sparingly.
Strip Logging Messages
Strings used in log messages can increase the size of your binaryand present a privacy concern. You can therefore instruct glog toremove all strings which fall below a certain severity level by usingthe GOOGLE_STRIP_LOG macro:
If your application has code like this:
#define GOOGLE_STRIP_LOG 1 // this must go before the #include!
#include <glog/logging.h>
The compiler will remove the log messages whose severities are lessthan the specified integer value. SinceVLOG logs at the severity level INFO(numeric value 0),setting GOOGLE_STRIP_LOG to 1 or greater removesall log messages associated with VLOGs as well asINFO log statements.
對於Windows用戶
glog的ERROR級錯誤與windows.h沖突. You can make glog not defineINFO, WARNING, ERROR,and FATAL by definingGLOG_NO_ABBREVIATED_SEVERITIES beforeincluding glog/logging.h . Even with this macro, you canstill use the iostream like logging facilities:
#define GLOG_NO_ABBREVIATED_SEVERITIES
#include <windows.h>
#include <glog/logging.h>

// ...

LOG(ERROR) << "This should work";
LOG_IF(ERROR, x > y) << "This should be also OK";
However, you cannotuse INFO, WARNING, ERROR,and FATAL anymore for functions definedin glog/logging.h .
#define GLOG_NO_ABBREVIATED_SEVERITIES
#include <windows.h>
#include <glog/logging.h>

// ...

// This won't work.
// google::FlushLogFiles(google::ERROR);

// Use this instead.
google::FlushLogFiles(google::GLOG_ERROR);
If you don't need ERROR definedby windows.h, there are a couple of more workaroundswhich sometimes don't work:
#define WIN32_LEAN_AND_MEAN or NOGDIbefore you #include windows.h .
#undef ERRORafter you #include windows.h .
See this issue for more detail.

③ caffe windows10 vs2013怎麼配置

1.配置環境
我在自己的筆記本配置的caffe,配置的環境為:Windows 7 64位 + cuda6.5 + Opencv2.49 +VS2013。假設在配置caffe之前,你已經准備好這些。
本文中將給出一些編譯好的依賴庫,如果你也是用的Windows 7 64位+VS2013,可以直接使用。
2.准備依賴庫
在Windows下配置caffe,一個很主要的問題就是依賴庫的編譯。不像在Ubuntu下那麼方便,在Windows下,依賴庫都需要使用vs2013進行編譯才能使用。下面我將介紹caffe需要的依賴庫(如果你也是win7 64位+VS2013,可以直接使用我提供的依賴庫)。
2.1 boost
boost可以下載源碼進行編譯,也可以直接下載安裝文件。我使用的是後者,方便、快捷。
我使用的是:boost_1.56_0-msvc-12.0-64.exe
注意下載適合你的配置環境的boost版本即可。
下載完畢,雙擊運行安裝文件即可。
2.2 Glog+Gflag+Protobuf+LevelDB+HDF5+LMDB+Openblas
這一部分的很多都是谷歌的開源庫,不容易下載(你懂的)。所以我使用的是Neil Z. SHAO『s Blog
提供的編譯好的。
下載完,解壓得到3rdparty文件夾。在下一段將會用到。
3.建立caffe工程
准備好了caffe需要的依賴庫和環境之後,下面就可以建立caffe的vs項目,進行編譯了。
3.1 下載caffe源碼
可以從caffe的github主頁下載源碼。
下載地址:Caffe』s GitHub
解壓文件,假設caffe源碼所在目錄為CAFFE_ROOT。
3.2 准備項目需要的依賴庫和系統環境變數
經過上一階段的准備,caffe項目所需的依賴庫都已經准備好。
1.首先設置系統環境變數(以我的為例):
CUDA_PATH_V6_5 安裝好cuda6.5之後,會自動添加環境變數CUDA_PATH_V6_5
OPENCV_2_49 D:/Tools/opencv2.49/build/
BOOST_1_56 D:/Tools/boost_1_56_0
2.將3rdparty文件夾放到CAFFE_ROOT
3.3 用vs建立caffe項目
1.用VS2013在CAFFE_ROOT下建立 win32 console application,選擇空項目。
將項目的平台由32位改為64位
2.修改項目屬性
項目——屬性——C/C++——常規——附加包含目錄
添加:
../include;
../src;
../3rdparty/include;
../3rdparty;
../3rdparty/include;
../3rdparty/include/openblas;
../3rdparty/include/hdf5;
../3rdparty/include/lmdb;
../3rdparty/include/leveldb;
../3rdparty/include/gflag;
../3rdparty/include/glog;
../3rdparty/include/google/protobuf;
項目——屬相——VC++目錄——包含目錄
添加:
$(CUDA_PATH_V6_5)\include;
$(OPENCV_2_49)\include;
$(OPENCV_2_49)\include\opencv;
$(OPENCV_2_49)\include\opencv2;
$(BOOST_1_56)
項目——屬性——鏈接器——常規——附加庫目錄
添加:
$(CUDA_PATH_V6_5)\lib\$(PlatformName);
$(OPENCV_2_49)\x64\vc12\lib;
$(BOOST_1_56)\lib64-msvc-12.0;
..\3rdparty\lib;
項目——屬性——鏈接器——輸入——附加依賴項
debug添加:
opencv_ml249d.lib
opencv_calib3d249d.lib
opencv_contrib249d.lib
opencv_core249d.lib
opencv_features2d249d.lib
opencv_flann249d.lib
opencv_gpu249d.lib
opencv_highgui249d.lib
opencv_imgproc249d.lib
opencv_legacy249d.lib
opencv_objdetect249d.lib
opencv_ts249d.lib
opencv_video249d.lib
opencv_nonfree249d.lib
opencv_ocl249d.lib
opencv_photo249d.lib
opencv_stitching249d.lib
opencv_superres249d.lib
opencv_videostab249d.lib
cudart.lib
cuda.lib
nppi.lib
cufft.lib
cublas.lib
curand.lib
gflagsd.lib
libglog.lib
libopenblas.dll.a
libprotobufd.lib
libprotoc.lib
leveldbd.lib
lmdbd.lib
libhdf5_D.lib
libhdf5_hl_D.lib
Shlwapi.lib
gflags.lib
libprotobuf.lib
leveldb.lib
lmdb.lib
libhdf5.lib
libhdf5_hl.lib
release添加:
opencv_ml249.lib
opencv_calib3d249.lib
opencv_contrib249.lib
opencv_core249.lib
opencv_features2d249.lib
opencv_flann249.lib
opencv_gpu249.lib
opencv_highgui249.lib
opencv_imgproc249.lib
opencv_legacy249.lib
opencv_objdetect249.lib
opencv_ts249.lib
opencv_video249.lib
opencv_nonfree249.lib
opencv_ocl249.lib
opencv_photo249.lib
opencv_stitching249.lib
opencv_superres249.lib
opencv_videostab249.lib
cudart.lib
cuda.lib
nppi.lib
cufft.lib
cublas.lib
curand.lib
gflags.lib
libglog.lib
libopenblas.dll.a
libprotobuf.lib
libprotoc.lib
leveldb.lib
lmdb.lib
libhdf5.lib
libhdf5_hl.lib
Shlwapi.lib
3.4 編譯caffe
配置好caffe項目的屬性之後,下面就可以一步一步的編譯caffe了。
3.4.1 編譯./src中的文件
首先,將../src文件夾中的*.cpp文件添加到工程中。

依次編譯每一個*.cpp文件。
1.編譯blob.cpp
直接編譯時會報錯,缺少文件」caffe\proto\caffe.pb.h」
這個時候需要將proto.exe放到../3rdparty/bin文件夾
將GernaratePB.bat放在../scripts文件夾

運行bat腳本文件即可生成caffe.pb.h
然後就可以成功編譯。
2.編譯common.cpp
直接編譯這個文件,會出現關於getid和fopen_s的錯誤。可通過如下步驟修改:
在代碼前面添加:#include <process.h>
修改項目屬性:項目——屬性——C/C++——預處理器——預處理器定義
添加:_CRT_SECURE_NO_WARNINGS
在代碼中getid的位置進行如下修改:
#ifdef _MSC_VER
pid = getid();
#else
pid = _getid();
#endf
修改完畢之後,可以成功編譯。
3.編譯net.cpp
直接編譯這個文件,會出現關於mkstep、close、mkdtemp的錯誤。需要進行如下修改:
在io.hpp頭文件中添加:#include 「mkstep.h」
在io.hpp頭文件中,在close()的位置進行如下修改:
#ifdef _MSC_VER
close(fd);
#else
_close(fd);
#endif
在mkdtemp的位置進行如下修改:
#ifndef _MSC_VER
char* mkdtemp_result = mkdtemp(temp_dirname_cstr);
#else
errno_t mkdtemp_result = _mktemp_s(temp_dirname_cstr, sizeof(temp_dirname_cstr));
#endif
修改完畢,可以成功編譯。
4.編譯solver.cpp
直接編譯會出現關於snprintf的錯誤,需要進行如下修改:
#ifdef _MSC_VER
#define snprinf sprintf_s
#endif
修改完畢,可以成功編譯。
5.其他剩餘的cpp文件也依次編譯
3.4.2 編譯./src/layers中的文件
將./src/layers中的所有的cpp和cu文件都添加到項目中。

右鍵點擊cu文件,修改屬性。

在bnll_layer.cu文件,進行如下修改:
float kBNLL_THRESHOLD = 50 ——> #define kBNLL_THRESHOLD 50.0
依次編譯所有的文件。
3.4.3 編譯./src/util中的文件
將./src/util中所有的文件添加到項目

1.在io.cpp中
修改ReadProtoFromBinaryFile函數
O_RDONLY ——> O_RDONLY | O_BINARY
在代碼中進行如下修改:
#ifdef _MSC_VER
#define open _open
#endif
將close()改為_close()
2.在math_functions.cpp中
做如下修改:
#define __builtin_popcount __popcnt
#define __builtin_popcountl __popcnt
3.在db.cpp中
作如下修改:
#ifdef _MSC_VER
#include <direct.h>
#endif
修改CHECK_EQ
#ifdef _MSC_VER
CHECK_EQ(_mkdir(source.c_str()),0)<<」mkdir」<<source<<」failed」;
#else
CHECK_EQ(mkdir(source.c_str(),0744),0)<<」mkidr」<<source<<」failed」;
#endif
4.依次編譯其他文件
3.4.4 編譯./src/proto中的文件
參照上一步,將proto中的文件都添加到項目。
修改屬性:
項目——屬性——C/C++——預處理器——預處理器定義
添加:_SCL_SECURE_NO_WARNINGS
編譯所有文件。
3.4.5 編譯./tools中的文件
本文件夾下有多個cpp文件,通過它們的名字就可以知道相應的功能。添加不同的cpp文件到項目中,然後生成項目,就可以得到不同功能的exe文件。
將caffe.cpp添加到工程,生成項目,得到caffe.exe文件,可用於訓練模型
將computer_image_mean.cpp添加到工程,生成項目,得到的exe文件可用於將訓練樣本轉換為caffe使用的leveldb/lmdb數據集。
依次類推。
自此,caffe在Windows下的編譯已經完畢,接下來就可以使用它來訓練自己的模型了。

④ Oasis 樂隊的《Supersonic》 的中文歌詞

Supersonic 中文歌詞
Wikipedia,自由的網路全書
收錄專輯:Definitely Maybe

Supersonic 超音速

I need to be myself
我要做自己
I can't be no one else
我不要像其他人一樣
I'm feeling supersonic
我正享受著超音速
Give me gin and tonic
請給我一杯gin and tonic
You can have it all but how much do you want it?
你可以一飲而盡但要喝多少杯才夠

You make me laugh
你讓我大笑
Give me your autograph
請給我你的簽名
Can I ride with you in your BMW ?
我可以坐上你的BMW一起兜風嗎?
You can sail with me in my yellow submarine
還是你可以坐上我的黃色潛水艇一同共游 (注1)

You need to find out
你得好好思索
'Cos no one's gonna tell you what I'm on about
因為不會有人告訴你我所言為何
You need to find a way for what you want to say
你得想辦法讓自己暢其所言
But before tomorrow
但得在天亮帶慎之前

'Cos my friend said he'd take you home
因為我的朋友說他會帶你蠢輪敬回家
He sits in a corner all alone
他坐在角落獨自一個人
He lives under a waterfall
他住在瀑布底下
No body can see him
別人見不到他
No body can ever hear him call
也聽不到他的呼喚桐譽

You need to be yourself
你得做你自己
You can't be no one else
不要像其他人一樣
I know a girl called Elsa
我認識個叫做Elsa的女孩
She's into Alka Seltzer
她對Alka Seltzer很著迷(注2)
She sniffs it through a cane on a supersonic train
她在超音速火車里用根管子吸食它

She made me laugh
她曾讓我大笑
I got her autograph
我也拿過她的簽名
She done it with a doctor on a helicopter
她曾在直升機里和一位醫生搞過
She's sniffin in her tissue
而如今她卻拿衛生紙直打噴嚏
Sellin' the Big Issue
在大街上叫賣雜志 (注3)

And She finds out
而現在她終於了解
no one's gonna tell her what I'm on about
沒有人要告訴她我所言為何
You need to find a way for what she wants to say
你得想辦法聽懂她要講什麼
But before tomorrow
但得在天亮之前

'Cos my friend said he'd take you home
因為我的朋友說他會帶你回家
He sits in a corner all alone
他坐在角落獨自一個人
He lives under a waterfall
他住在瀑布底下
No body can see him
別人見不到他
No body can ever hear him call
也聽不到他的呼喚

⑤ 如何解決使用glog和gflags時遇到的錯誤

我們都知道在Visual Studio中使用OpenCV是非常方便的,只要配置好相關和啟拍的路徑,建立一個屬性表就可以了。接觸過Caffe的可能會知道,在Caffe的常式中並沒有怎麼說如何建立一個屬性表,就能夠使用Caffe提供的一些函數去構造程序。話說一旁碰個月前剛剛在Github上幫一個老外解決了這個問喚羨題,所以這里也寫一下我的方法。
要用Caffe,就是 include 、lib 、dll,和OpenCV一樣,搞好這三個即可,推薦大家配置Release版本的,所以在編譯Caffe的時候,換成Release模式也編譯一次。
實現
觀察caffe-master的第三方程序包,毫無疑問,這個與caffe-master本文件夾都需要加上去的。

⑥ 如何解決使用glog和gflags時遇到的錯誤

錯誤是這樣的:

/usr/local/lib/libgflags.a: error adding symbols: Bad value collect2: error: ld returned 1 exit status
glog是通過下面方式搏攜安裝畢銀者的:
sudo apt-get install build-essential
sudo apt-get install vim cmake git
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler
在上面的安裝中同時安裝了gflags,不僅如此,我還在git上下載了gflags的源碼也進行了安裝。
解決方法:
我對下載的gflags源碼進行編譯,在cmake時候加入了expor CXXFLAGS="-fPIC"、make VERBOSE=1就可以正常使用gflags和glog了。手薯
即:
export CXXFLAGS="-fPIC" && cmake .. && make VERBOSE=1
make && make install

⑦ VS2015 windows編程出現error C2062 意外的類型「int」

1、錯誤內容:
意外的類型「type」
編譯器不需要類型名稱。
2、錯誤示蠢銀鍵例:
下面的例子生成 C2062:
// C2062.cpp
// compile with: /c
struct A { : int l; }; // C2062
struct B { private: int l; }; // OK
3、說明:
編譯器處理構造函數的參數列表中未定義類型的方式也可能導致C2062。 如果編譯器遇到未定義的(拼錯了嗎?)類型,則它假定構造函數是一個表達式,並發出 C2062。
若搏者要帶巧解決此錯誤,請只使用構造函數參數列表中的定義類型。

熱點內容
生女的演算法 發布:2025-07-18 08:17:54 瀏覽:645
加密硬碟推薦 發布:2025-07-18 08:11:22 瀏覽:944
oppo手機的密碼是多少 發布:2025-07-18 08:10:27 瀏覽:764
2匹壓縮機重 發布:2025-07-18 08:01:40 瀏覽:181
雲蟻物聯的雲存儲怎麼取消退款 發布:2025-07-18 08:01:39 瀏覽:486
訪問電腦版網頁 發布:2025-07-18 08:01:02 瀏覽:246
php集成軟體 發布:2025-07-18 07:54:36 瀏覽:143
華為密碼多少我忘記了告訴我 發布:2025-07-18 07:53:05 瀏覽:286
安卓怎麼上傳音樂到網易雲 發布:2025-07-18 07:22:22 瀏覽:375
c語言保存txt文件 發布:2025-07-18 07:01:27 瀏覽:175