Невозможно загрузить простой модуль DLL с помощью Lua 5.4: «Указанный модуль не найден» ⇐ C++
Невозможно загрузить простой модуль DLL с помощью Lua 5.4: «Указанный модуль не найден»
Я пытаюсь создать модуль DLL, который будет необходим сценарию Lua 5.4 (64-разрядная версия Windows). Я создал простую DLL в Visual Studio на основе нескольких примеров, которые мне удалось найти, однако, когда я пытаюсь ее запросить, я получаю сообщение «ошибка загрузки модуля 'testlib' из файла 'C:\lua\testlib. dll': указанный модуль не найден». Это происходит при запуске require('testlib') из командной строки, а также из встроенного скрипта.
Я начал с C++, потому что для этого в Visual Studio был шаблон, но если C будет более подходящим, я с радостью перейду. Для меня это совершенно новая территория.
Это мой код. Для целей первоначального тестирования просто предоставляется одна функция, которая складывает два числа, но цель состоит в том, чтобы получить строку и заставить систему преобразования текста в речь ОС прочитать ее. Я пишу с помощью Visual Studio, и зависимость разрешается с помощью vcpkg.
Я впервые работаю с C++, поэтому дайте мне знать, если мне нужно включить еще какую-либо важную информацию.
#include "pch.h" #include внешний "С" { static int add(lua_State* L) { lua_Number n1 = luaL_checknumber(L, 1); lua_Number n2 = luaL_checknumber(L, 2); lua_pushnumber(L, n1 + n2); возврат 1; } статическая константа luaL_Reg mylib[] = { {"добавить", добавить}, {НОЛЬ НОЛЬ} }; __declspec(dllexport) int luaopen_testlib(lua_State* L) { luaL_newlib (L, mylib); возврат 1; } } BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { переключатель (ul_reason_for_call) { случай DLL_PROCESS_ATTACH: случай DLL_THREAD_ATTACH: случай DLL_THREAD_DETACH: случай DLL_PROCESS_DETACH: перерыв; } вернуть ИСТИНА; } Я просмотрел все существующие сообщения, которые смог найти, в которых упоминалось это сообщение об ошибке, но безуспешно (почти каждый пример собирается для Linux, но в моем случае сборка для Windows является обязательным требованием).
edit 1: Этот другой вопрос, вероятно, считается дубликатом, но остается без ответа и предшествует Lua 5.4. Комментарий: «Библиотеки DLL C++ — это особый вид зверей. Если возможно, я рекомендую вам придерживаться C в DLL, если вы действительно не знаете, что делаете». указывает на то, что, возможно, мне было бы лучше сделать это на C. Я пытался адаптировать код, но результат был тот же. Несмотря на то, что кто-то поспешил с выводами и удалил тег C, он очень актуален, поэтому я его прочитал.
Редактирование 2: Это моя попытка создать эквивалентный код C, основанный на этом примере из 2021 года. Как упоминалось в первом редактировании, я скомпилировал DLL, но получил точно такое же сообщение об ошибке (за исключением, конечно, нового имени файла). ) при запуске require('testc').
#include #include static int add(lua_State* L) { lua_Number n1 = luaL_checknumber(L, 1); lua_Number n2 = luaL_checknumber(L, 2); lua_pushnumber(L, n1 + n2); возврат 1; } статический luaL_Reg const mylib[] = { {"добавить", добавить}, {НОЛЬ НОЛЬ} }; __declspec(dllexport) int luaopen_testc(lua_State* L) { luaL_newlib (L, mylib); возврат 1; } Редактировать 3: Я собирался принять ответ, но обнаружил, что он был удален модератором. Я не уверен почему, потому что в этом посте было много полезной информации (и решения), но я попытаюсь обобщить ее, потому что, хотя эта ошибка появляется в ряде мест в Stack Overflow, ни в одном из они упоминают это решение:
Причина, по которой не удалось загрузить DLL, заключалась в отсутствии зависимости lua.dll. Решением было скопировать lua.dll вместе с моим новым модулем.
Хотя это кажется нелогичным, причина в том, что среда выполнения Lua хоста не делает библиотеки доступными для загружаемых модулей.
Поэтому в данном случае ошибка «Указанный модуль не найден» относится к зависимости, а не к загружаемому модулю.
В комментарии говорилось, что этого, вероятно, можно избежать, статически связывая зависимость так, чтобы она скомпилировалась/связывалась с модулем в той же DLL. Я еще не подтвердил это, но нет необходимости решать первоначальную проблему, поэтому я все равно считаю эту проблему решенной.
В любом случае, моя проблема решена, я просто не могу принять ответ и не хочу репостить то, что уже было, потому что не знаю причину удаления, чтобы исправить это во второй раз .
Я пытаюсь создать модуль DLL, который будет необходим сценарию Lua 5.4 (64-разрядная версия Windows). Я создал простую DLL в Visual Studio на основе нескольких примеров, которые мне удалось найти, однако, когда я пытаюсь ее запросить, я получаю сообщение «ошибка загрузки модуля 'testlib' из файла 'C:\lua\testlib. dll': указанный модуль не найден». Это происходит при запуске require('testlib') из командной строки, а также из встроенного скрипта.
Я начал с C++, потому что для этого в Visual Studio был шаблон, но если C будет более подходящим, я с радостью перейду. Для меня это совершенно новая территория.
Это мой код. Для целей первоначального тестирования просто предоставляется одна функция, которая складывает два числа, но цель состоит в том, чтобы получить строку и заставить систему преобразования текста в речь ОС прочитать ее. Я пишу с помощью Visual Studio, и зависимость разрешается с помощью vcpkg.
Я впервые работаю с C++, поэтому дайте мне знать, если мне нужно включить еще какую-либо важную информацию.
#include "pch.h" #include внешний "С" { static int add(lua_State* L) { lua_Number n1 = luaL_checknumber(L, 1); lua_Number n2 = luaL_checknumber(L, 2); lua_pushnumber(L, n1 + n2); возврат 1; } статическая константа luaL_Reg mylib[] = { {"добавить", добавить}, {НОЛЬ НОЛЬ} }; __declspec(dllexport) int luaopen_testlib(lua_State* L) { luaL_newlib (L, mylib); возврат 1; } } BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { переключатель (ul_reason_for_call) { случай DLL_PROCESS_ATTACH: случай DLL_THREAD_ATTACH: случай DLL_THREAD_DETACH: случай DLL_PROCESS_DETACH: перерыв; } вернуть ИСТИНА; } Я просмотрел все существующие сообщения, которые смог найти, в которых упоминалось это сообщение об ошибке, но безуспешно (почти каждый пример собирается для Linux, но в моем случае сборка для Windows является обязательным требованием).
edit 1: Этот другой вопрос, вероятно, считается дубликатом, но остается без ответа и предшествует Lua 5.4. Комментарий: «Библиотеки DLL C++ — это особый вид зверей. Если возможно, я рекомендую вам придерживаться C в DLL, если вы действительно не знаете, что делаете». указывает на то, что, возможно, мне было бы лучше сделать это на C. Я пытался адаптировать код, но результат был тот же. Несмотря на то, что кто-то поспешил с выводами и удалил тег C, он очень актуален, поэтому я его прочитал.
Редактирование 2: Это моя попытка создать эквивалентный код C, основанный на этом примере из 2021 года. Как упоминалось в первом редактировании, я скомпилировал DLL, но получил точно такое же сообщение об ошибке (за исключением, конечно, нового имени файла). ) при запуске require('testc').
#include #include static int add(lua_State* L) { lua_Number n1 = luaL_checknumber(L, 1); lua_Number n2 = luaL_checknumber(L, 2); lua_pushnumber(L, n1 + n2); возврат 1; } статический luaL_Reg const mylib[] = { {"добавить", добавить}, {НОЛЬ НОЛЬ} }; __declspec(dllexport) int luaopen_testc(lua_State* L) { luaL_newlib (L, mylib); возврат 1; } Редактировать 3: Я собирался принять ответ, но обнаружил, что он был удален модератором. Я не уверен почему, потому что в этом посте было много полезной информации (и решения), но я попытаюсь обобщить ее, потому что, хотя эта ошибка появляется в ряде мест в Stack Overflow, ни в одном из они упоминают это решение:
Причина, по которой не удалось загрузить DLL, заключалась в отсутствии зависимости lua.dll. Решением было скопировать lua.dll вместе с моим новым модулем.
Хотя это кажется нелогичным, причина в том, что среда выполнения Lua хоста не делает библиотеки доступными для загружаемых модулей.
Поэтому в данном случае ошибка «Указанный модуль не найден» относится к зависимости, а не к загружаемому модулю.
В комментарии говорилось, что этого, вероятно, можно избежать, статически связывая зависимость так, чтобы она скомпилировалась/связывалась с модулем в той же DLL. Я еще не подтвердил это, но нет необходимости решать первоначальную проблему, поэтому я все равно считаю эту проблему решенной.
В любом случае, моя проблема решена, я просто не могу принять ответ и не хочу репостить то, что уже было, потому что не знаю причину удаления, чтобы исправить это во второй раз .
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение