gpt4 book ai didi

c++ - 在可移植应用程序中包含外星人,C++

转载 作者:太空宇宙 更新时间:2023-11-04 12:13:28 24 4
gpt4 key购买 nike

好的,我已经搜索了很多,但似乎无法找到如何实现此目标的答案或示例。

基本上,我有一个设计为可移植的应用程序(在 VS2010 中使用 VC++ 构建,但没有 MFC 或托管组件,原始 WinAPI)。我内置了 Lua 5.2,允许用户在应用程序中编写脚本。我有多个粘合函数,这些函数暴露给处理各种 WinAPI 调用的 Lua 脚本。

但是,我希望能够让用户编写一个如下所示的脚本:

require[[Alien/alien]]

local mb = alien.User32.MessageBoxA
mb:types{ 'long', 'long', 'string', 'string', 'long' }
print(mb(0, "Hello World!", "Test", 64))

我似乎无法找到一种方法来做到这一点。我不想要求用户为 Windows 安装 Lua,理想情况下,没有来自 alien 的 core.dll 和 struct.dll;当我尝试对 ./alien/中的那些 DLL 执行某些操作时,它在 Lua5.1.dll 中崩溃,因为我安装了 LuaForWindows,我卸载了 LFW,然后它只是指出 Lua5.1.dll 丢失了。我在我的应用程序中内置了 Lua 5.2,所以显然来自 Alien rock 的核心/结构 DLL 期望 Lua5.1.dll 在路径中。

我做了一个毫无值(value)的尝试,试图将 Alien src 包含到项目中,但似乎也没有那样做。

任何想法将不胜感激。我希望所有内容都包含在我的应用程序中,但如果这是唯一的选择,我会接受一个解决方案,该解决方案涉及在我的项目中包含库以在分发中构建和捆绑。

谢谢!

更新:

好的,谢谢 Ben Voigt!我想我快到了。我引入了 core.c 和 struct.c 并确保所有路径都适用于 libffi。一切编译都没有问题,直到我尝试在 core.c(alien.core src 文件)中调用 luaopen_alien_core,声称标识符未声明。我试图在我试图进行调用的单独源文件中声明函数签名,编译进一步进行,但未能提示 Unresolved external 问题。

很明显,这现在可能是一个普遍的 C++ 问题(因为我只是这个领域的新手)。这是我的总体思路:

//core.c (from Alien project)

(...)

int luaopen_alien_core(lua_State *L) {
alien_register_library_meta(L);
alien_register_callback_meta(L);
alien_register_function_meta(L);
alien_register_buffer_meta(L);
lua_getglobal(L, "alien");
if(lua_isnil(L, -1)) {
lua_newtable(L);
lua_pushvalue(L, -1);
lua_setglobal(L, "alien");
}
lua_newtable(L);
lua_pushvalue(L, -1);
lua_setfield(L, -3, "core");
alien_register_main(L);
return 1;
}

//mysource.c (the file attempting to call luaopen_alien_core(L))

void initLua()
{
L = luaL_newstate();
luaL_openlibs(L);
luaopen_alien_core(L);
(...)
}

这无法开始编译,发出错误:

error C3861: 'luaopen_alien_core': identifier not found

这是有道理的,所以我将以下行添加到 myheader.h:

int luaopen_alien_core(lua_State *L);

这会编译,但无法链接到:

error LNK2001: unresolved external symbol "int __cdecl luaopen_alien_core(struct lua_State *)" (?luaopen_alien_core@@YAHPEAUlua_State@@@Z)

根据我有限的经验,我已经尝试了几种我能想到的方法,但没有任何方法可以解决这个错误。我什至试图将 core.c 的内容移动到 mysource.c 中,但这造成了完全不同的困惑,而且似乎是错误的方法。

我希望并想象,这真的很愚蠢,但我只是不确定如何让它调用 luaopen_alien_core,这似乎是我需要的最后一部分。

再次感谢!

最佳答案

我想 require 指令加载动态库并将其内容添加到事件的 Lua 引擎。

通过将 alien 直接链接到您的代码中,您就不需要动态库了。但是内容枚举代码不会运行,你不能使用 require 来运行它,否则它会去寻找 DLL 文件(以及所有 DLL 依赖项)。

因此,您应该在加载 DLL 后找出 require 指令调用哪些函数,并在创建 Lua 引擎时调用这些函数。这样就不需要也不允许脚本以 require [[Alien/alien]] 开头,但 Alien 对象将可用。

关于c++ - 在可移植应用程序中包含外星人,C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8783147/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com