2013-07-29 49 views
3

前提:我希望我的C++应用程序不依赖于任何Microsoft Visual C++ redistributable,所以我可以发布我的可执行文件,这些文件可以直接使用。如何静态构建和链接LuaJIT(VS 2013)

我已经先进行:(?,不应该VS 2013需要120版本,因为它是编译器版本),以避免msvcr110.dll需要切换运行时库Multithread (/MT)DLL Multithread (/MD)。要做到这一点,我还必须重新编译我正在使用相同的运行时库,并工作的另一个库。我有我的.exe可以在任何地方运行没有问题(或者我不知道,哈哈)。

然后我添加了一些使用LuaJIT的功能。我已经通过软件包提供的msvcbuild.bat构建了LuaJIT,它的工作方式就像一个魅力,但现在我的可执行文件需要运行msvcr110.dll。我想这是因为LuaJIT是用/ MD标志编译的,但我想知道是否有正确的方法来做我想要的。

+0

你需要在运行时加载Lua/C模块..? – NREZ

+0

@NREZ这是我第一次使用Lua,目前我只用它来执行一些基本脚本。所以我想我不需要它(我已经阅读了作者网站上的警告)。 –

+0

好吧,这很酷。事情是,如果你静态链接它,你将不会面临任何依赖性问题,如果你仍然这样做,那么你可以使用这个很酷的工具,名为[Dependency Walker](http://www.dependencywalker.com/),它可以帮助你排序出来。始终确保你在'Release'中编译其他库。虽然有时你可能会遇到这种情况,当你强制需要包含一些.dll文件时,你可以通过创建安装文件并将它包含在你的安装中来添加它们,但每个人都这样做。在获得关于它的更多信息方面最好。 – NREZ

回答

4

我没有对此进行测试,但您很可能需要在编译的每一部分上使用/ MT标志。在这种情况下,你的主程序和LuaJIT都是。在该msvcbuild.bat文件(https://github.com/luvit/luajit-2.0/blob/master/src/msvcbuild.bat)中,您可以看到它们明确指定了/ MD(第17行)。这是你的问题。将其更改为/ MT并查看。

+1

我已经试过(但忘了提及它......),并认为它在构建我的项目时遇到了错误。我再次尝试,通过仔细观察脚本,我发现它接受'static'作为参数。结合'/ MT'标志和'static'使我得到了我想要的。谢谢你让我调查一下,如果我们幸运的话,我会让赏金开放一点点的信息。 –

+0

不要忘记删除所有/ DLUA_BUILD_AS_DLL标志,否则您将会丢失DLL错误。 –

5

您应该运行msvcbuild.batstatic命令行参数。

+0

“msvcbuild.bat static”。这是正确的答案。谢谢。 – dns