print.c在Lua 5.2中缺失,尝试从源代码中构建。

我正在尝试从源代码构建 Lua,当我查看 http://www.lua.org/source/5.2/ 时,我基本上看到了源文件中的内容,但我没有看到print.c。

在我的build.bat文件中(我在Windows 7上做这个),我有这个:

cl /MD /O2 /W3 /c /DLUA_BUILD_AS_DLL *.c
del *.o
ren lua.obj lua.o
ren luac.obj luac.o
ren print.obj print.o
link /DLL /IMPLIB:lua5.2.lib /OUT:lua5.2.dll *.obj
link /OUT:lua.exe lua.o lua5.2.lib
lib /out:lua5.2-static.lib *.obj
link /OUT:luac.exe luac.o print.o lua5.2-static.lib

如果我只删除对print.o的所有引用,那么当我尝试将其嵌入我的游戏中时,我编译的东西会有问题吗?

在lua 5.1中,在编译器下,您将看到print.c,因此我想我不应该使用5.2。

http://www.lua.org/source/5.1/

更新

所以,我所做的是更改我的build.bat并删除print.obj,但我认为重命名对于不将lua.obj和luac.obj包含在.lib文件中是有用的,因此我将它们重命名,然后再将它们重命名回来。

cl /MD /O2 /W3 /c /DLUA_BUILD_AS_DLL *.c
del *.o
ren lua.obj lua.o
ren luac.obj luac.o
link /DLL /IMPLIB:lua5.2.lib /OUT:lua5.2.dll *.obj
link /OUT:lua.exe lua.o lua5.2.lib
lib /out:lua5.2-static.lib *.obj
ren lua.o lua.obj
ren luac.o luac.obj
link /OUT:luac.exe luac.obj lua5.2-static.lib
点赞
用户68204
用户68204

在Lua 5.2中,你不需要print.c,它定义的唯一公共函数已经移动到了luac.c中。现在可以在luac.c中找到PrintFunction()函数。

另外,在Windows中将.obj重命名为.o并不是一个好主意。请使用您的工具链首选的任何对象文件名称。

编辑:现在我看到了重命名的目的,尽管它确实能够工作,但我仍然认为这是一个不好的实践。

这样做的关键在于批处理文件中的CL命令使用相同的选项编译当前目录中的每个.c文件。恰巧,这不是一个问题,但这不是做这类事情的常规方法。

随后,因为其中一些文件实际上并不是要构建的DLL的一部分,所以重命名它们可以将其余的文件作为单个通配符*.obj放入LINK命令行中。

如果要使用批处理文件自己构建Lua,则最好在每个相关的链接行上列出构成DLL和每个应用程序的.obj文件,而不是依靠通配符。如果CL命令出现构建错误,则构建DLL时仍将包含_所有其他_对象,或者更糟糕的是,可能使用未及时编译的对象构建了DLL。

然后,即使出现错误,在建立最终的lua.exeluac.exe时,您也可能出现可以或可能无法成功链接的情况。

正确的方法是使用某种形式的构建工具进行编译和链接。微软应该提供NMake,还可能会提供他们的内部工具BUILD(用于驱动Windows内核和设备驱动程序的构建,我知道它随DDK工具一起提供,但我认为它也在Platform SDK中,并且可能被深深地烧入VS中),并且还有添加更广泛使用的构建系统(例如GNU Make,CMAKE或无数其他)的选项。

如果您坚持使用重命名的技巧,因为现在它比学习正确的方法更快捷,请至少添加一些测试来检查每个编译和链接步骤的成功完成,例如IF ERRORLEVEL 1 GOTO :EOF命令。如下所示,在失败后结束批处理文件。

编辑批处理文件时,我注意到另一个潜在的问题。您使用/DLUA_BUILD_AS_DLL编译了所有的OBJ文件,但随后制作了一个静态库并从中链接luac.exe。我不确定源代码的哪些特性会受到该定义的修改,但使用其编译的OBJ文件制作静态库而不是DLL可能不是明智的选择。

cl /MD /O2 /W3 /c /DLUA_BUILD_AS_DLL *.c
if ERRORLEVEL 1 goto :EOF
del *.o
ren lua.obj lua.o
ren luac.obj luac.o
link /DLL /IMPLIB:lua5.2.lib /OUT:lua5.2.dll *.obj
if ERRORLEVEL 1 goto :EOF
link /OUT:lua.exe lua.o lua5.2.lib
if ERRORLEVEL 1 goto :EOF
cl /MD /O2 /W3 /c *.c
if ERRORLEVEL 1 goto :EOF
del *.o
ren lua.obj lua.o
ren luac.obj luac.o
lib /out:lua5.2-static.lib *.obj
if ERRORLEVEL 1 goto :EOF
ren lua.o lua.obj
ren luac.o luac.obj
link /OUT:luac.exe luac.obj lua5.2-static.lib
if ERRORLEVEL 1 goto :EOF
2013-04-30 21:01:47