g++: c++的編譯器.cc,c++文件最好還是用g++,有時會出現undefined symbol: __gxx_personality_v0 這樣的錯誤。
cc和cpp的區別:c++文件,除了Unix系統外,其他的平臺上,C++文件的後綴名基本上都是 *.cpp。
-Wl,-rpath:gcc編譯鏈接動態庫時,很有可能編譯通過,但是執行時,找不到動態鏈接庫,(如果用ldd -r 命令查看動態庫的依賴 項,會出現類似的提示:libpython3.6m.so.1.0 => not found)那是因爲-L選項指定的路徑只在編譯時有效,編譯出來的可執行文件不知道-L選項後面的值,這時需要用該指令記錄動態庫的位置。-rdynamic: 用來通知鏈接器將所有符號添加到動態符號表中,程序動態調用動態庫中的函數,編譯時用到該選項,通常和-ldl一起用。
-I:指定頭文件路徑。
-lpthread: 鏈接線程庫。
-lm:鏈接數學庫。
-ldl:鏈接dl庫。
-o: 表示編譯並鏈接 所有依賴文件。
-c: 表示只編譯不鏈接。
-g: 表示帶調試信息。-std=c++11。
-w:的意思是關閉編譯時的警告,也就是編譯後不顯示任何warning。
-Wall:編譯後顯示所有警告。
-Wno-sign-compare: 關閉當有符號轉換爲無符號時,有符號和無符號值比較產生的錯誤警告。
-Wno-unused-local-typedefs:忽略本地未使用的類型定義警告。
-Wno-deprecated-declarations:關閉使用廢棄API的警告。
-Winit-self:自己初始化自己的警告。-msse:讓編譯器使用cpu的sse指令集,可以使用mmx寄存器計算單精度浮點運算。
-msse2:讓編譯器使用奔騰cpu的指令集,可以使用mmx寄存器計算雙精度浮點運算。
-pthread:多線程。
-DKALDI_DOUBLEPRECISION=0
-DHAVE_EXECINFO_H=1
-DHAVE_CXXABI_H
-DHAVE_ATLAS
-------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------------
識別源碼最終編譯指令(鏈接的靜態庫):
g++ -std=c++11 -I.. -I/usr/wxf/kaldi/tools/openfst/include -Wno-sign-compare -Wall -Wno-sign-compare -Wno-unused-local-typedefs -Wno-deprecated-declarations -Winit-self -DKALDI_DOUBLEPRECISION=0 -DHAVE_EXECINFO_H=1 -DHAVE_CXXABI_H -DHAVE_ATLAS -I/usr/wxf/kaldi/tools/ATLAS/include -msse -msse2 -pthread -g -Wl,-rpath=/usr/wxf/kaldi/tools/openfst/lib -rdynamic recognition.cc ../hmm/kaldi-hmm.a ../ivector/kaldi-ivector.a ../feat/kaldi-feat.a ../transform/kaldi-transform.a ../gmm/kaldi-gmm.a ../tree/kaldi-tree.a ../util/kaldi-util.a ../matrix/kaldi-matrix.a ../base/kaldi-base.a /usr/wxf/kaldi/tools/openfst/lib/libfst.so /usr/lib64/atlas/libsatlas.so.3 /usr/lib64/atlas/libtatlas.so.3 -Wl,-rpath=/usr/lib64/atlas -lm -lpthread -ldl -o recognition