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