windows环境下编译luasocket + lua5.3

luasocket 源码:
https://github.com/diegonehab/luasocket

lua5.3源码
http://www.lua.org/ftp/lua-5.3.3.tar.gz

环境:
windows 10 64位
下载安装mingw,选择安装:

Mingw Base System
    mingw32-gcc/bin
MSYS Base System
    msys-bash/bin    // 不安装这个会出现make的时候提示/bin/sh找不到的错误
    msys-make/bin

由于目前mingw自带的gcc版本比较低,目前为6.3.0,而使用这个版本编译luasocket的时候,会报错。
https://stackoverflow.com/questions/48812849/luasocket-error-not-enough-memory-declaration
这个老哥最后的解决方法是使用mingw-w64来代替mingw。但是我这边替换了之后还有一些问题,就是Mingw-w64有些东西没有,比如说make的工具链就不全。所以使用了mingw+mingw64混合配置的方案。
其中make命令使用mingw,而gcc工具使用mingw-w64下的。

首先是编译lua。

cd lua5.3.3
make install mingw

此时会自动安装好一些lua的头文件和部分文件到mingw的安装目录。

还有个需要注意的地方,C:\MinGW\msys\1.0\bin\lua\5.3这个目录需要存放win64的lua53.dll
我从lua-5.3.3_Win64_dll12_lib.zip中解压出来


此时进入到luasocket目录,

$ make PLAT=mingw LUAV=5.3 LUAINC_mingw=/c/MinGW/msys/1.0/local/include

其中/c/MinGW/msys/1.0/local/include为安装lua的时候,自动安装的头文件路径,这个路径会给编译luasocket时候使用。
平台选mingw,lua的版本使用5.3,第三个参数为头文件路径。

还有一个步骤,这里比较奇怪。
C:\MinGW\msys\1.0\bin\lua\5.3 在这个目录下(如果不存在手动创建一下)。下载lua win64的dll库,方便在编译luasocket的时候使用。
https://sourceforge.net/projects/luabinaries/files/5.3.3/Windows%20Libraries/Dynamic/
选择lua-5.3.3_Win64_dll12_lib.zip
这里用win32的dll就不会编译成功。

如果上次没编译成功,就make clean一下

xxxx@DESKTOP-6xxxxx MINGW64 /e/git/luasocket (master)
$ make PLAT=mingw LUAV=5.3 LUAINC_mingw=/c/MinGW/msys/1.0/local/include
/usr/bin/make -C src mingw
make[1]: Entering directory `/e/git/luasocket/src'
/usr/bin/make all PLAT=mingw
make[2]: Entering directory `/e/git/luasocket/src'
gcc  -IC:/MinGW/msys/1.0/local/include -DLUASOCKET_INET_PTON -DLUASOCKET_NODEBUG -DWINVER=0x0501 -Wall -O2 -fno-common   -c -o luasocket.o luasocket.c
gcc  -IC:/MinGW/msys/1.0/local/include -DLUASOCKET_INET_PTON -DLUASOCKET_NODEBUG -DWINVER=0x0501 -Wall -O2 -fno-common   -c -o timeout.o timeout.c
gcc  -IC:/MinGW/msys/1.0/local/include -DLUASOCKET_INET_PTON -DLUASOCKET_NODEBUG -DWINVER=0x0501 -Wall -O2 -fno-common   -c -o buffer.o buffer.c
gcc  -IC:/MinGW/msys/1.0/local/include -DLUASOCKET_INET_PTON -DLUASOCKET_NODEBUG -DWINVER=0x0501 -Wall -O2 -fno-common   -c -o io.o io.c
gcc  -IC:/MinGW/msys/1.0/local/include -DLUASOCKET_INET_PTON -DLUASOCKET_NODEBUG -DWINVER=0x0501 -Wall -O2 -fno-common   -c -o auxiliar.o auxiliar.c
gcc  -IC:/MinGW/msys/1.0/local/include -DLUASOCKET_INET_PTON -DLUASOCKET_NODEBUG -DWINVER=0x0501 -Wall -O2 -fno-common   -c -o compat.o compat.c
gcc  -IC:/MinGW/msys/1.0/local/include -DLUASOCKET_INET_PTON -DLUASOCKET_NODEBUG -DWINVER=0x0501 -Wall -O2 -fno-common   -c -o options.o options.c
gcc  -IC:/MinGW/msys/1.0/local/include -DLUASOCKET_INET_PTON -DLUASOCKET_NODEBUG -DWINVER=0x0501 -Wall -O2 -fno-common   -c -o inet.o inet.c
gcc  -IC:/MinGW/msys/1.0/local/include -DLUASOCKET_INET_PTON -DLUASOCKET_NODEBUG -DWINVER=0x0501 -Wall -O2 -fno-common   -c -o except.o except.c
gcc  -IC:/MinGW/msys/1.0/local/include -DLUASOCKET_INET_PTON -DLUASOCKET_NODEBUG -DWINVER=0x0501 -Wall -O2 -fno-common   -c -o select.o select.c
gcc  -IC:/MinGW/msys/1.0/local/include -DLUASOCKET_INET_PTON -DLUASOCKET_NODEBUG -DWINVER=0x0501 -Wall -O2 -fno-common   -c -o tcp.o tcp.c
gcc  -IC:/MinGW/msys/1.0/local/include -DLUASOCKET_INET_PTON -DLUASOCKET_NODEBUG -DWINVER=0x0501 -Wall -O2 -fno-common   -c -o udp.o udp.c
gcc luasocket.o timeout.o buffer.o io.o auxiliar.o compat.o options.o inet.o wsocket.o except.o select.o tcp.o udp.o  /usr/bin/lua/5.3/lua53.dll -shared -Wl,-s -lws2_32 -o socket-3.0-rc1.dll
gcc  -IC:/MinGW/msys/1.0/local/include -DLUASOCKET_INET_PTON -DLUASOCKET_NODEBUG -DWINVER=0x0501 -Wall -O2 -fno-common   -c -o mime.o mime.c
gcc mime.o compat.o  /usr/bin/lua/5.3/lua53.dll -shared -Wl,-s -lws2_32 -o mime-1.0.3.dll
make[2]: Leaving directory `/e/git/luasocket/src'
make[1]: Leaving directory `/e/git/luasocket/src'

至此编译成功,生成了两个dll文件。
socket-3.0-rc1.dll
mime-1.0.3.dll


最后make install 之后,会在目录中形成这样的结构

C:\MinGW\msys\1.0\lua\5.3
						|- lua
							| - socket
							| - ltn12.lua
							| - mine.lua
							| - socket.lua
						|- mine
							|- core.dll
						|- socket
							|- core.dll

将这个目录中的上述内容,目录结构不改,拷贝到lua-5.3.3_Win64_bin目录中,就可以正常跑起来了。

-- hello.lua
local socket = require"lua/socket"
local mime   = require"lua/mime"
print("Hello from " .. socket._VERSION .. " and " .. mime._VERSION .. "!")

输出

Hello from LuaSocket 3.0-rc1 and MINE 1.0.3 !

最后
感谢这位老哥的文章,我之前编译出来了dll文件,但是不清楚怎么运行起来。看了这个文章就豁然开朗
https://blog.csdn.net/honglicu123/article/details/72705572

你可能感兴趣的:(windows环境下编译luasocket + lua5.3)