Невозможно загрузить простой модуль DLL с помощью Lua 5.4: «Указанный модуль не найден»C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Невозможно загрузить простой модуль DLL с помощью Lua 5.4: «Указанный модуль не найден»

Сообщение Anonymous »


Я пытаюсь создать модуль 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. Я еще не подтвердил это, но нет необходимости решать первоначальную проблему, поэтому я все равно считаю эту проблему решенной.

В любом случае, моя проблема решена, я просто не могу принять ответ и не хочу репостить то, что уже было, потому что не знаю причину удаления, чтобы исправить это во второй раз .
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»