文章目錄
- 前言
- 一、環境
- 二、編譯過程
- 2.1 gcc安裝
- 2.2 編譯lua
- 2.3 編譯srlua庫
- 三、測試srlua庫
- 參考
- 總結
前言
一、環境
centos7.9
gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
lua5.1源碼
srlua 源碼
二、編譯過程
2.1 gcc安裝
yum install gcc
這里gcc安裝過程和環境沒有詳細介紹,編譯成二進制需要gcc編譯器。
2.2 編譯lua
目錄結構:
- lua/lua5.1.5/src
- srlua/
查看lua源碼結構
[root@localhost srlua]# ls ../lua/lua-5.1.5
COPYRIGHT doc etc HISTORY INSTALL Makefile README src test
You have mail in /var/spool/mail/root
[root@localhost lua-5.1.5]# make linux
cd src && make linux
make[1]: Entering directory `/mnt/hgfs/D/workspace/github/lua/lua-5.1.5/src'
make all MYCFLAGS=-DLUA_USE_LINUX MYLIBS="-Wl,-E -ldl -lreadline -lhistory -lncurses"
make[2]: Entering directory `/mnt/hgfs/D/workspace/github/lua/lua-5.1.5/src'
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lapi.o lapi.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lcode.o lcode.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o ldebug.o ldebug.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o ldo.o ldo.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o ldump.o ldump.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lfunc.o lfunc.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lgc.o lgc.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o llex.o llex.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lmem.o lmem.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lobject.o lobject.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lopcodes.o lopcodes.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lparser.o lparser.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lstate.o lstate.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lstring.o lstring.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o ltable.o ltable.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o ltm.o ltm.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lundump.o lundump.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lvm.o lvm.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lzio.o lzio.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lauxlib.o lauxlib.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lbaselib.o lbaselib.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o ldblib.o ldblib.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o liolib.o liolib.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lmathlib.o lmathlib.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o loslib.o loslib.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o ltablib.o ltablib.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lstrlib.o lstrlib.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o loadlib.o loadlib.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o linit.o linit.c
ar rcu liblua.a lapi.o lcode.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o lauxlib.o lbaselib.o ldblib.o liolib.o lmathlib.o loslib.o ltablib.o lstrlib.o loadlib.o linit.o # DLL needs all object files
ranlib liblua.a
gcc -O2 -Wall -DLUA_USE_LINUX -c -o lua.o lua.c
gcc -o lua lua.o liblua.a -lm -Wl,-E -ldl -lreadline -lhistory -lncurses
gcc -O2 -Wall -DLUA_USE_LINUX -c -o luac.o luac.c
gcc -O2 -Wall -DLUA_USE_LINUX -c -o print.o print.c
gcc -o luac luac.o print.o liblua.a -lm -Wl,-E -ldl -lreadline -lhistory -lncurses
make[2]: Leaving directory `/mnt/hgfs/D/workspace/github/lua/lua-5.1.5/src'
make[1]: Leaving directory `/mnt/hgfs/D/workspace/github/lua/lua-5.1.5/src'
[root@localhost lua-5.1.5]# make install
cd src && mkdir -p /usr/local/bin /usr/local/include /usr/local/lib /usr/local/man/man1 /usr/local/share/lua/5.1 /usr/local/lib/lua/5.1
cd src && install -p -m 0755 lua luac /usr/local/bin
cd src && install -p -m 0644 lua.h luaconf.h lualib.h lauxlib.h ../etc/lua.hpp /usr/local/include
cd src && install -p -m 0644 liblua.a /usr/local/lib
cd doc && install -p -m 0644 lua.1 luac.1 /usr/local/man/man1
[root@localhost lua-5.1.5]#
可以看到已經編譯完成,有liblua.a文件和lua文件
[root@localhost lua-5.1.5]# ls ./src/
lapi.c lauxlib.o lcode.o ldebug.o ldump.o lgc.h liolib.c llimits.h lmem.o lobject.o loslib.o lstate.h lstrlib.c ltablib.c lua luaconf.h lundump.h lzio.c print.o
lapi.h lbaselib.c ldblib.c ldo.c lfunc.c lgc.o liolib.o lmathlib.c loadlib.c lopcodes.c lparser.c lstate.o lstrlib.o ltablib.o luac lua.h lundump.o lzio.h
lapi.o lbaselib.o ldblib.o ldo.h lfunc.h liblua.a llex.c lmathlib.o loadlib.o lopcodes.h lparser.h lstring.c ltable.c ltm.c lua.c lualib.h lvm.c lzio.o
lauxlib.c lcode.c ldebug.c ldo.o lfunc.o linit.c llex.h lmem.c lobject.c lopcodes.o lparser.o lstring.h ltable.h ltm.h luac.c lua.o lvm.h Makefile
lauxlib.h lcode.h ldebug.h ldump.c lgc.c linit.o llex.o lmem.h lobject.h loslib.c lstate.c lstring.o ltable.o ltm.o luac.o lundump.c lvm.o print.c
2.3 編譯srlua庫
我們使用makefile文件進行編譯,而非CMakeList文件
修改MakeFile文件,指定LUA路徑,這里需要改為你自己的lua源代碼根路徑
# makefile for srlua# change these to reflect your Lua installation
LUA= /mnt/hgfs/D/workspace/github/lua/lua-5.1.5
[root@localhost srlua]# make
gcc -I/mnt/hgfs/D/workspace/github/lua/lua-5.1.5/src -ansi -pedantic -Wall -Wextra -O2 -c -o srlua.o srlua.c
srlua.c: In function ‘getprog’:
srlua.c:141:3: warning: implicit declaration of function ‘readlink’ [-Wimplicit-function-declaration]n = readlink("/proc/self/exe", progdir, nsize);^
gcc -o srlua -Wl,-E srlua.o -L/mnt/hgfs/D/workspace/github/lua/lua-5.1.5/src -llua -lm -ldl
gcc -I/mnt/hgfs/D/workspace/github/lua/lua-5.1.5/src -ansi -pedantic -Wall -Wextra -O2 glue.c -o glue
./glue srlua test.lua a.out
chmod +x a.out
./a.out *
hello from inside /mnt/hgfs/D/workspace/github/srlua/a.out
19 a.out cmake CMakeLists.txt dist.info glue glue.c glue.h glue.rc lua.ico lua_powered.ico Makefile README.md srlua srlua.c srlua.o srlua.rc test test.lua wmain.c
bye!
hello again from inside /mnt/hgfs/D/workspace/github/srlua/a.out
0 /mnt/hgfs/D/workspace/github/srlua/a.out
1 a.out
2 cmake
3 CMakeLists.txt
4 dist.info
5 glue
6 glue.c
7 glue.h
8 glue.rc
9 lua.ico
10 lua_powered.ico
11 Makefile
12 README.md
13 srlua
14 srlua.c
15 srlua.o
16 srlua.rc
17 test
18 test.lua
19 wmain.c
bye now!
[root@localhost srlua]#
三、測試srlua庫
使用srlua自帶的test.lua文件生成為test二進制文件,并執行。
[root@localhost srlua]# ./glue ./srlua test.lua test
[root@localhost srlua]# ll test
-rwxr-xr-x. 1 xxxxxxx xxxxx 199356 May 14 18:56 test
[root@localhost srlua]# ls test
test
[root@localhost srlua]# test
You have mail in /var/spool/mail/root
[root@localhost srlua]# ./test
hello from inside /mnt/hgfs/D/workspace/github/srlua/test
0
bye!
hello again from inside /mnt/hgfs/D/workspace/github/srlua/test
0 /mnt/hgfs/D/workspace/github/srlua/test
bye now!
[root@localhost srlua]#
結果顯而易見,已經轉化成功。
參考
https://github.com/LuaDist/srlua
總結
總結一下過程,先編譯lua源碼,后引入對應路徑到srlua庫中用于編譯srlua的glue srlua文件。
關于博主
wx/qq:binary-monster/1113673178
wxgzh: 二進制怪獸
CSDN:https://blog.csdn.net/qq1113673178
碼云:https://gitee.com/shiver
Github: https://github.com/ShiverZm
個人博客:https://www.shiver.fun
歡迎加入博主的知識星球