編譯(compile):將.c或.cpp文件編譯成.o(linux)或者.obj(windows)文件,也稱爲中間目標文件linux
連接(link):將.o或.obj連接成可執行文件,windows下是.exe結尾,Linux沒有限制,通常不帶有後綴名macos
庫文件:大型項目編譯時生成的目標文件太多,主要是給中間目標文件打包windows
靜態 => .a .lib,在連接時生成執行文件函數
動態 => .so .dll,由執行文件運行時加載優化
gcc xxx.c,編譯成功後默認生成a.out執行文件 => ./a.outlua
gcc xxx.c -o demo 或 gcc -o demo xxx.c spa
gcc xxx.o -o demo調試
gcc xxx.c -S demo.sip
gcc xxx.i -o demo內存
Mac下編譯lua動態庫,須要加上-dynamiclib -Wl,-undefined,dynamic_lookup,如編譯ding.c,如下爲Makefile裏面文件內容:
linux:
#默認頭文件頭文件地址/usr/local/include
gcc ding.c -fPIC -shared -o ding.so
macosx:
gcc ding.c -fPIC -dynamiclib -Wl,-undefined,dynamic_lookup -shared -o ding.so -I/usr/local/include/lua
以上二者都能使部分函數自動inline。項目應該追求在O2的優化下能編譯經過,若是在全局優化下,針對局部避免優化,能夠嘗試使用noinline 或 __attribute__((optimize(「O0」)))來修飾函數。