我正在尝试从源代码构建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
答案 0 :(得分:4)
Lua 5.2中不需要print.c
,它定义的唯一公共函数移动到luac.c
。请参阅luac.c
中的PrintFunction()
。
此外,在Windows中将.obj
重命名为.o
并不是一个好主意。使用工具链首选的任何目标文件名。
编辑:我现在看到了重命名的目的,虽然它确实有效,但我仍然认为这是一种不好的做法。
诀窍是批处理文件中的CL
命令正在使用相同的选项编译当前目录中的每个.c
文件。碰巧,这不是问题,但这不是传统的做这种事情的方式。
然后,因为其中一些文件实际上并不是您要构建的DLL的一部分,所以您重命名这些文件,以便您可以将LINK
命令行中的其余文件作为单个通配符{{ 1}}。
如果您打算使用批处理文件自己构建Lua,那么最好列出构成DLL的*.obj
文件以及每个相关链接行上的每个应用程序,而不是依赖于野外卡。实际上,如果你在CL命令中有一个构建错误,你仍然用对象的所有其余构建一个DLL,或者更糟糕的是,可能是对于没有文件的过时对象编译。
然后即使出现错误,您也可能成功链接lua.exe和luac.exe。
这里正确的答案是使用某种形式的构建工具来编译和链接。微软应该为你提供NMake,它可能已经为你提供了他们的内部工具(用于驱动Windows内核和设备驱动程序的构建,我知道它带有DDK工具,但我认为它也在Platform SDK中并且可能被埋没在VS)名为BUILD,并且总是可以选择添加更广泛使用的构建系统,例如GNU Make,CMAKE或无数其他构建系统。
如果你坚持使用重命名技巧,因为它比现在以正确的方式学习更方便,那么请至少添加一些测试,以便成功完成每个编译和链接步骤.obj
失败后结束批处理文件的命令,如下所示。
在编辑批处理文件时,我注意到另一个潜在的问题。您使用IF ERRORLEVEL 1 GOTO :EOF
构建了所有OBJ文件,但随后创建了一个静态库并从中链接了luac.exe。我不知道该定义修改了源文本的哪些特性,但是用它编译的OBJ文件而不是DLL编译静态库可能并不明智。
/DLUA_BUILD_AS_DLL