0

我正在尝试从源代码构建 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,但我认为重命名对于在 .lib 文件中不包含 lua.obj 和 luac.obj 很有用,所以我重命名它们然后重命名他们回来了。

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
4

1 回答 1

4

你不需要print.c在 Lua 5.2 中,它定义的唯一公共函数被移动到luac.c. 见PrintFunction()现在发现luac.c

此外,在 Windows中重命名为 也不是一个好主意.obj.o使用您的工具链首选的任何目标文件名。

编辑:我现在看到了重命名的目的,虽然它确实有效,但我仍然认为这是一种不好的做法。

诀窍是CL批处理文件中的命令使用相同的选项编译.c当前目录中的每个文件。碰巧,这不是问题,但这不是做这类事情的传统方式。

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

如果您打算使用批处理文件自己构建 Lua,那么最好.obj在每个相关链接行上列出构成 DLL 和每个应用程序的文件,而不是依赖通配符。事实上,如果您在 CL 命令中出现构建错误,您仍然会构建一个包含所有其余对象的 DLL,或者更糟糕的是,可能会为未编译的文件构建一个过期的对象。

那么即使出现错误,您也可能成功链接 lua.exe 和 luac.exe。

这里的正确答案是使用某种形式的构建工具来编译和链接。Microsoft 应该为您提供 NMake,它可能为您提供了他们的内部工具(用于驱动 Windows 内核和设备驱动程序的构建,我知道它与 DDK 工具一起提供,但我认为它也在 Platform SDK 中并且可能被埋没在 VS 中)命名为 BUILD,并且始终可以选择添加更广泛使用的构建系统,例如GNU Make、CMAKE 或无数其他系统。

如果您坚持使用重命名技巧,因为它比现在学习正确的方式更方便,那么请至少添加一些测试以成功完成每个编译和链接步骤,并使用IF ERRORLEVEL 1 GOTO :EOF命令结束批处理文件失败,如下图。

当我编辑批处理文件时,我注意到另一个潜在问题。您使用 构建了所有 OBJ 文件/DLUA_BUILD_AS_DLL,然后创建了一个静态库并从中链接 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-30T21:01:47.827 回答