2015-02-24 47 views
2

我正在使用可從Lua站點下載的Lua52.exe二進制文件。我想用我寫的DLL擴展它的功能。所以我寫了一個DLL,將Lua源文件包含到我的VS DLL項目中。該代碼如下。當我在通過Lua52.exe運行的lua文件中執行以下操作時,出現「檢測到多個Lua虛擬機」錯誤。所以Lua52.exe帶有lua52.dll,所以我認爲它是動態鏈接的,當它啓動時它會加載lua52.dll來啓動一個lua虛擬機。當我的DLL被加載時,我會懷疑傳入的lua_State來自lua52.exe。 VM在談論什麼?我是否必須動態鏈接到我的DLL中的lua?我可以讓我的DLL不以某種方式創建一個lua虛擬機嗎?我的意思是我不是自己做這件事,所以lua來源的東西必須是。多個Lua VM檢測到

package.loadlib("LuaDLLTest.dll", "luaopen_msglib")() 


#define DLL_EXPORT extern "C" __declspec(dllexport) 

#include "lua.hpp" 

#define PI (3.14159265358979323846) 

static int miles_to_km(lua_State *L) 
{ 
    double miles = luaL_checknumber(L, 1); 
    double km = miles * 1.609; 
    lua_pushnumber(L, km); 
    return 1; /* one result */ 
} /* end of miles_to_km */ 

static int circle_calcs(lua_State *L) 
{ 
    double radius = luaL_checknumber(L, 1); 
    double circumference = radius * 2 * PI; 
    double area = PI * radius * radius; 
    lua_pushnumber(L, circumference); 
    lua_pushnumber(L, area); 
    return 2; /* one result */ 
} /* end of miles_to_km */ 

static const luaL_Reg testlib[] = 
{ 
    { "miles_to_km", miles_to_km }, 
    { "circle_calcs", circle_calcs }, 
    { NULL, NULL } 
}; 


/* 
** Open msg library 
*/ 
DLL_EXPORT int luaopen_msglib(lua_State *L) 
{ 
    lua_newtable(L); 
    luaL_setfuncs(L, testlib, 0); 
    lua_setglobal(L, "Math"); 

    return 1; 
} 
+2

lua二進制模塊不能鏈接lua自己。在Windows上,這比在其他系統上更困難,我認爲你需要鏈接到將運行你的模塊的lua二進制文件的**相同** lua dll。 – 2015-02-24 16:33:48

+0

所以基本上你說要做https://msdn.microsoft.com/en-us/library/ms810279.aspx?我很困惑。或者你的意思是在我的DLL項目中做一個動態鏈接,因爲它應該加載lua53.exe使用的lua52.dll。 – user441521 2015-02-24 16:35:23

+0

我不*認爲*如此。你的模塊不應該直接加載lua。 [this](http://lua-users.org/wiki/BuildingModules)有幫助嗎? – 2015-02-24 16:39:28

回答

1

只要lua52.exe和你的DLL鏈接到相同的DLL,你不應該看到這個錯誤。這個錯誤可能發生在兩種情況下:(1)lua52.exe包括靜態編譯的Lua解釋器(Lua VM),當你的模塊從它編譯的lua52.dll加載虛擬機時,你會得到「檢測到多個Lua虛擬機」消息。 (2)lua52.exe是針對lua52.dll編譯的,並且您的模塊是針對另一個包含Lua VM的dll編譯的。兩者都最終加載(類似於第一種情況),這會觸發錯誤。

首先你需要弄清楚lua52是否確實鏈接到了lua52.dll。你可以簡單地檢查它的大小(DLL是180K,exe文件在我的Windows機器上是14K),或者運行類似depends的東西來查看依賴關係。如果您確認它與lua52.dll鏈接,並且您的模塊鏈接到相同的DLL,我希望它能夠正常工作。我使用與您使用相同的命令(package.loadlib("socket/core.dll", "luaopen_socket_core")())在類似的庫上進行了測試,並且它的加載沒有錯誤。