Как подключить lua к visual studio
Ссылки на проект, который можно использовать как основу и "болванку" для вашей библиотеки. Уже все настроено как надо, собрано в кучку. Проект для VS2015. Также можно открыть в более новой версии VS.
zip-архив - исходные тексты примера из этой статьи и готовая скомпилированная библиотека dll
В приведенном готовом проекте по ссылкам выше предусмотрены следующие варианты сборки в зависимости от требуемой версии QUIK (указано в формате: Solution Configurations | Solution Platforms):
Release / Debug | Win32 - для QUIK 6.x / 7.x (x32, Lua5.1)
Release / Debug | x64 - для QUIK 8.0. 8.4 (x64, Lua5.1)
Release-Lua53 / Debug-Lua53 | x64 - для QUIK 8.5 и далее (x64, Lua5.3)
Release-Lua54 / Debug-Lua54 | x64 - для QUIK 8.11 и далее (x64, Lua5.4)
Есть вопросы? что-то не понятно? Вэлком в комментарии.
2 Ответ от admin 2012-12-19 21:01:52
Написание собственных .dll-библиотек на С++ для подключения их к коду Lua (QLua) и вызов своих функций из этих библиотек
Здесь примеры будут рассматриваться на C++ (т.к. именно этот и только этот язык рассмотрен в документации LUA), но если у кого-то будет острое желание делать внешние модули на другом языке - пишите в комментариях. (Есть отдельная тема про Delphi / Lazarus.)
Скажу сразу: здесь не планируется и не будет исчерпывающего описания взаимодействия LUA и Си. Просто потому, что такого материала в интернете просто завались, ничего нового я не открою.
Однако хотелось бы привести описание шагов, позволяющих сделать «быстрый старт» в написании своей библиотеки, попутно указав на некоторые неочевидные нюансы настройки проекта.
Начну в каком-то смысле «с конца».
Чтобы подключить внешнюю DLL библиотеку к LUA, в скрипте необходимо необходимо вписать строчку:
В результате выполнения этой строчки в LUA будет закружена библиотека с именем luacdll.dll (причем расширение в require не указывается), и из этой библиотеки будет прочитана информация об имеющихся в ней функциях, доступных из LUA (позже мы увидим каким именно образом).
Для простоты и надежности я очень советую положить скомпилированный dll-файл в тот же каталог, где расположен сам терминал QUIK, это проще и надежнее всего. Хотя можно настроить в LUA-скрипте содержимое переменной package.cpath до строки с require, если очень хочется.
Уточнение для QUIK 8.11 и более новых версий по поводу расположения файла скомпилированного dll-файла. Начиная с этой версии, для выполнения скриптов доступен выбор версии интерпретатора Lua: 5.3 или 5.4. Это добавляет проблем с выбором места, где расположить изготовленную нами библиотеку. Если вы гарантированно используете лишь одну версию (либо 5.3, либо 5.4) для выполнения всех своих скриптов - то можете также положить библиотеку в корень терминала QUIK. Это будет просто и надёжно. Однако, если вы планируете запускать скрипты с разными версиями интерпретатора, что придется держать 2 версии библиотеки (скомпилированные для Lua5.3 и Lua5.4) и подгружать в скрипт соответствующую версию библиотеки (при использовании неподходящей сборки dll-библиотеки непременно будут проблемы в работе библиотеки). Подробнее этот момент рассмотрен в отдельной ветке форума.
Настройка C++ проекта
Первые три файла содержат описание типов и прототипы интерфейсных функций LUA, четвертый - библиотека для статический линковки с внешней библиотекой интерпретатора lua5.1.dll.
Открываем MS Visual Studio, создаем новый проект DLL.
В свойствах проекта для всех конфигураций, какие мы будем собирать (обычно это Release и Debug), необходимо добавить библиотеку lua5.1.lib в дополнительные библиотеки. В приложенном примере она лежит в подпапке contrib:
Открываем cpp-файл нашего проекта. Вначале добавляем в него заголовочные файлы LUA, причем перед их включением (это важно!) добавляем определение двух переменных препроцессора: они необходимы для случая сборки DLL, доступной из LUA. Если бы мы собирали наоборот LUA-интерпретатор, запускающий из себя LUA-скрипты, то необходимо было бы сделать другие определения.
Подключаем единый файл lua.hpp, в котором:
подключаются все необходимые заголовочные файлы Lua;
т.к. наш проект C++, то заголовочные файлы Lua необходимо подключать под extern "C", что уже сделано в этом едином файле.
Для release-конфигураций выбираем:
Для debug-конфигураций выбираем:
Теперь собственно код библиотеки на C++
Т.к. библиотеку мы назвали luacdll и именно это имя указываем в Lua-скрипте в require, то при загрузке нашей библиотеки LUA-интерпретатор будет искать экспортируемую из нее функцию с определенным именем, состоящем из "двух частей". В нашем случае это имя будет luaopen_ luacdll (). Здесь luaopen_ это предопределенный префикс (см. документацию), а luacdll собственно имя нашей библиотеки. Разумеется, тип и аргументы этой функции тоже предопределены.
Для Lua 5.1 эта функция должна содержать следующие строки :
Здесь мы регистрируем в LUA-интерпретаторе (путем вызова luaL_openlib) те функции, которые мы предоставляем из нашей библиотеки, что делает их доступными для вызова из LUA-скриптов. Вторым параметром функции передается namespace (имя глобальной переменной), в котором будут доступны функции нашей библиотеки при вызове; чтобы не запутаться, namespace делаем совпадающим с именем нашей библиотеки.
Для Lua 5.2 и более новых версий эта функция должна содержать следующие строки :
Здесь мы тоже регистрируем в LUA-интерпретаторе (путем вызова luaL_newlib) те функции, которые мы предоставляем из нашей библиотеки, что делает их доступными для вызова из LUA-скриптов. В отличии от варианта для Lua 5.1 никакая глобальная переменная не задаётся, функции библиотеки становятся доступными в той переменной, которой присвоим результат выполнения require() в коде Lua-скрипта.
luaL_newlib() - это удобный макрос, который сразу включает в себя вызов трех интерфейсных функций Lua:
luaL_checkversion - для проверки версии интерпретатора Lua, особенно актуально для QUIK 8.11;
luaL_newlibtable и luaL_setfuncs - функции, последовательно вызываемые для регистрации функций, реализованных в библиотеке.
(Функция luaL_openlib() удалена из Lua 5.2 как устаревшая.)
В нашей простейшей библиотеке будут реализованы 3 функции, доступные из LUA:
GetCurrentThreadId - получить ID текущего потока
MultTwoNumbers - перемножает 2 числа, заданных в качестве аргументов
MultAllNumbers - перемножает все числа, встретившиеся в аргументах
Сам список функций (имя и указатель на соответствующую Си-функцию) описан в константном массиве:
Реализация функции, возвращающей ID текущего потока:
Ее прототип предопределен и един для всех интерфейсных функций: принимает единственный параметр L - указатель на стек LUA (см. документацию).
В данном случае функция не подразумевает никаких аргументов и возвращает единственное целочисленное значение.
Исходный код остальных функций можно посмотреть в приложенном архиве, на мой взгляд, в особых комментариях он не нуждается. В реализации MultAllNumbers можно посмотреть как производится обработка вызова функции из LUA с произвольным числом и типом параметров.
После компиляции получившийся DLL-файл (как было сказано) копируем в тот же каталог, где расположен терминал QUIK (обязательно перепишите туда же файл lua5.1.dll!), и запускаем в нем следующий LUA-скрипт, предварительно сохраним его в виде файла:
Полностью исходные тексты и скомпилированную dll можно скачать по ссылкам в первом посте этой темы.
Установка lua это вопрос, который возникает достаточно часто. Что, вообще-то, достаточно удивительно, потому как установка lua на самом деле, крайне проста и понятна. Можно даже сказать, что там вообще нечего делать. Но, раз уж такие вопросы возникают, давайте немного поговорим об установке Lua.
Установка Луа. Скачиваем
Установка Луа. Компиляция.
- Запускаем Visual Studio
- Выполняем Tools->Visual Studio Command Prompt
- Переходим в папку с луа, в директорию etc. Вот так: cd D:/mylibs/lua-5.1.4
- запускаем скрипт компиляции луа: etc/luavs.bat
- Мы получили нужны нам файлы lua.exe и luac.exe
Второй способ без запуска Visual Studio:
Установка Луа. Доступ
Установка Луа. Статическая линковка.
Установка Луа. Проверка.
Проверим, всё ли работает. Создаём новый проект (я сделал консольный проект win32). Дописываем инклюды луа:
и доделываем сам main():
В настройки линковщика (Project/Properties/Linker/Input/Addition Dependencies) не забываем добавить нашу библиотеку (lua.lib для релиза и lua-debug.lib для дебага). Компилируем. Создаём тестовый файлик с луа-скриптом:
На этом наш урок завершён. Теперь у вас есть собранные версии дебаг- и релиз- версий луа, собранные для статической компиляции и вы можете без каких-либо проблем использовать их в ваших проектах.
В следующих уроках мы более подробно поговорим про использование луа-скриптов в программах и, в частности, в играх.
Автор, спасибо, хорошая статья, всё работает!
Не за что Очень рад, что у Вас всё получилось!
Что говорит? Какие ошибки?
Спасибо гуглу, за то, что я смог повторить то же самое в xcode.
Василий подскажи сайт где описано как подключить lua к xcode. А то ничего толкового найти не могу.
А как на счет компиляции LUA ? Будут статьи?
Папку с lua распаковал в диск С
Setting environment for using Microsoft Visual Studio 2010 x86 tools.
c:\program files\microsoft visual studio 10.0\vc\bin>cd C:/lua-5.1.4
C:\lua-5.1.4\etc>cd C:/lua-5.1.4/etc/luavs
Системе не удается найти указанный путь.
C:\lua-5.1.4\etc>cd src
Системе не удается найти указанный путь.
C:\lua-5.1.4\etc>cl /nologo /MD /O2 /W3 /c /D_CRT_SECURE_NO_DEPRECATE /DLUA_BUIL
D_AS_DLL l*.c
l*.c
c1 : fatal error C1083: Не удается открыть файл источник: l*.c: Invalid argument
C:\lua-5.1.4\etc>del lua.obj luac.obj
Не удается найти C:\lua-5.1.4\etc\lua.obj
C:\lua-5.1.4\etc>if exist lua51.dll.manifest mt /nologo -manifest lua51.dll.mani
fest -outputresource:lua51.dll;2
C:\lua-5.1.4\etc>cl /nologo /MD /O2 /W3 /c /D_CRT_SECURE_NO_DEPRECATE /DLUA_BUIL
D_AS_DLL lua.c
lua.c
c1 : fatal error C1083: Не удается открыть файл источник: lua.c: No such file or
directory
C:\lua-5.1.4\etc>if exist lua.exe.manifest mt /nologo -manifest lua.exe.manifest
-outputresource:lua.exe
C:\lua-5.1.4\etc>cl /nologo /MD /O2 /W3 /c /D_CRT_SECURE_NO_DEPRECATE l*.c print
.c
l*.c
c1 : fatal error C1083: Не удается открыть файл источник: l*.c: Invalid argument
C:\lua-5.1.4\etc>del lua.obj linit.obj lbaselib.obj ldblib.obj liolib.obj lmathl
ib.obj loslib.obj ltablib.obj lstrlib.obj loadlib.obj
Не удается найти C:\lua-5.1.4\etc\lua.obj
C:\lua-5.1.4\etc>link /nologo /out:luac.exe *.obj
LINK : warning LNK4001: не указаны объектные файлы; использованы библиотеки
LINK : warning LNK4068: параметр /MACHINE не указан; принимается по умолчанию на
X86
LINK : fatal error LNK1561: точка входа должна быть определена
C:\lua-5.1.4\etc>if exist luac.exe.manifest mt /nologo -manifest luac.exe.manife
st -outputresource:luac.exe
C:\lua-5.1.4\etc>del *.obj *.manifest
Не удается найти C:\lua-5.1.4\etc\*.obj
- Open with Desktop
- View raw
- Copy raw contents Copy raw contents Loading
Copy raw contents
Copy raw contents
Приглагаемый код плагина можно скомпилировать примерно следующим образом из Developer Command Prompt (32-битного) от MSVS:
Более подробно инструкции даны в тексте этого документа.
Цель примера и приобретаемые навыки
- Создание с нуля "пустого" проекта QluaCpp
- Использование простейшей функции message Qlua
Для написания и запуска плагина понадобится ряд программ.
Торговый терминал Quik понадобится только для запуска плагина, написание кода и сборка возможна без него
Система контроля версий git понадобится для скачивания библиотек и их зависимостей. Установка другим способом находящихся под git библиотек данного проекта не рекомендуется, поскольку в их структуре используются подмодули, обеспечивая соответствие версий зависимостей.
Библиотека qluacpp является header-only библиотекой. Использование CMake не обязательно при использовании qluacpp, но для удобства сам пример будет разрабатываться с использованием CMake.
Для сборки этого примера потребуется NMake, входящий в состав Microsoft Visual Studio или Windows Development Tools. Сама IDE не потребуется, хотя будет показано, как сгенерировать проект Visual Studio из CMake. В примере использовалась Visual Studio 2017
Для написания кода и других файлов примера используется только текстовый редактор, что делает разработку независимой от среды. Можно использовать любой текстовый редактор: от Visual Studio, Notepad и т.п. При создании этого примера использовался Emacs.
Начальная структура проекта
На файловой системе проект плагина будет выглядеть следующим образом
../contrib - директория для сторонних библиотек, в том числе qluacpp. Обратите внимание, чтоб эта директория находится в корневой директории примеров (на один уровень выше директории этого примера).
src - исходные файлы нашего плагина
Создаем указанные выше директории, после чего помещаем наш проект под систему контроля версий git. Если используется совместимый со стандартным git, для этого открываем Command Prompt от Windows, заходим в директорию проекта и выполняем:
В дальнейшем подразумевается, что читатель будет по мере необходимости самостоятельно делать git commit
Установка сторонних библиотек
В директории contrib проекта для установки qluacpp исполняем команду:
Для обновления зависимостей подмодуля исполняем:
git submodule update --init --recursive
Скачивание нужной версии библиотеки
На момент написания данного документа максимальной версией в рамках ветви 5.1 является версия 5.1.5. Переходим в этот каталог, где далее выбираем Windows Libraries и Dynamic.
Выбираем архив, ближайщий к нашему сценарию использования. Например, на момент написания для Win32, dll, 14 = lua-5.1.5_Win32_dll14_lib.zip; для Win64, dll, 15 = lua-5.1.5_Win64_dll15_lib.zip
В директории contrib создаем директорию lua. Копируем туда содержимое скаченного оригинального архива с библиотекой Lua.
Создание CMake проекта
В директории проекта создаем файл CMakeLists.txt
В начале файла указываем:
Создаем переменные с путями к используемым в проекте библиотекам и их зависимостям:
Устанавлиаем переменные с указанием пути к файлам библиотеки lua. Для lib-файла делаем это через переменную LUA_LIBRARIES, настроив ее на путь к скаченному lib-файлу библиотеки Lua:
Указываем путь к загаловкам скаченной библиотеки Lua:
Перечисляем исходные файлы нашего плагина:
Указываем, что мы хотим создать DLL:
Указываем конфигурацию линковки (подсоединяем нужные библиотеки к компилируемой dll):
Пишем код плагина
Создание едиственного исходного файла примера
Создаем файл basic_tutorial.cpp в директории src и открываем его в редакторе.
Декларируем через директивы препроцессора, что мы создаем "библиотеку" Lua:
Подключаем заголовки из стандартной библиотеки для работы со временем и потоками (используются, чтоб делать паузу в функции main).
После этого подключаем библиотеку qluacpp:
Создаем пустую глобальную структуру для интерфейса наших "библиотечных" функций для Lua:
Создаем обработчик Lua-функции main:
Декларируем структуры Luacpp для обработчика main. Цифра "2" в конце имени макроса указывает количество параметров к макросу. Первый аргумент содержит имя функции внутри Lua, второй - имя соответствующей ей функции C++ в нашем коде:
Создаем видимую извне функцию с C ABI, которая будет инициализировать "библиотеку":
Внутри функции luaopen_lualib_basic_tutorial из указателя на структуру с состоянием Lua создаем объект интерфейса Lua с C++:
Наконец, подключаем нашу "библиотеку" к Lua:
В любом удобном месте, не внутри директории с репозитарием проекта, мы должны создать директории, в которые будет сгенерирован при помощи CMake проект под нужную нам среду.
В меню Start Windows ищем Command Prompt for VS2017. При выборе следует помнить, под какую разрядность системы компилируется проект. Поэтому, если компиляция происходит, например , на 64-битном Windows под 32-битный Quik, следует выбирать x64_x86 Cross Tools Command Prompt.
Компиляция проекта при помощи NMake
NMake - мейкер от Microsoft, который поставляется в составе Visual Studio, Windows Developer Tools и др.
Создаем директорию basic_tutorial_nmake
Заходим в нее и выполняем:
где последний аругмент - путь к коду проекта, а опция -G указывает, под какую среду генерировать проект.
В результате будет скомпилирован файл DLL нашего плагина, который можно использовать как Lua "библиотеку" в Quik.
Проект (solution) IDE Visual Studio
Cоздаем директорию basic_tutorial_vs. Заходим в нее и выполняем:
где последний аругмент - путь к коду проекта, а опция -G указывает, под какую среду генерировать проект. Для 64-битных целей компиляции следует указывать битность, например -G "Visual Studio 15 2017 Win64"
После этого в указанной директории будет создан проект Visual Studio нашего плагина. Описание дальнейшей работы с Visual Studio не является предметом данного документа.
Установка плагина в терминал Quik
Если в директории терминала Quik нет файла lua5.1.dll (прокси-библиотеки с интерфейсом Lua от Arqa), но есть lua51.dll, создаем копию файла lua51.dll и называем ее lua5.1.dll, для соответствия идентификаторам, используемым в родном файле lua5.1.lib из состава архива Lua, который мы скачивали на этапе установки библиотек.
Для Quik 8 x64 (Lua 5.1) скачать готовое решение VS 2019 Community можно по этой ссылке
Для Quik 8 x64 (Lua 5.3.5) скачать готовое решение VS 2019 Community можно по этой ссылке
Далее, выбираем тип файла "Файл C++" из вкладки "Visual C++":
Можно назвать его так же, как проект, чтобы не путаться. После нажатия на кнопку "Добавить" в проекте, в папке "Файлы исходного кода" появится пустой файл исходного кода C/C++.
Следующим шагом необходимо добавить в проект заголовочные файлы и библиотеку Lua Для этого, скачайте данный архив, в нем, в папке "Lua" находятся следующие файлы: lauxlib.h, lua.h, luaconf.h и lua5.1.lib. Извлеките эту папку из архива и поместите в одной папке с файлом исходного кода C++, как показано на изображении:
Сейчас можно добавить их в проект, для этого нужно в "Обозревателе решений" кликнуть правой кнопкой мыши по папке "Заголовочные файлы" и далее выбрать: "Добавить" -> "Существующий элемент. "
Откройте добавленную папку "Lua", выделите, зажав кнопку "Ctrl", 3 заголовочных файла, как показано на изображении, и нажмите кнопку "Добавить".
Для этого, нужно правой кнопкой мыши кликнуть по названию проекта (не решения) и выбрать "Свойства":
Откроется окно свойств, в котором нужно "Тип конфигурации" установить, как "Динамическая библиотека (.dll)":
Убедитесь, что в поле "Набор символов" установлено значение "Использовать набор символов Юникода".
В поле "Поддержка общеязыковой среды выполнения (CLR)" должно быть значение "Без поддержки CLR-среды":
Для того, чтобы скрипт Qlua мог работать с библиотекой DLL, она должна находится в корневом каталоге терминала QUIK. По-этому, в поле "Выходной каталог" можно сразу указать папку с терминалом QUIK, тогда библиотека будет компилироваться сразу в нее и, в последствии, после внесения каких-либо изменений, не придется постоянно заменять старую DLL на новую:
Далее, нужно перейти: "Свойства конфигурации" -> "Компоновщик" -> "Ввод". В поле "Дополнительные зависимости" из выпадающего списка выбрать пункт "<Изменить. >".
В открывшемся окне в верхнее поле добавить строку "Lua\lua5.1.lib" и нажать кнопку "ОК"
Теперь осталось нажать кнопки "Применить" и "ОК".
Для того, чтобы узнать как Lua может взаимодействовать с библиотекой DLL, написанной на C/C++, ознакомьтесь с данной статьей.
то, после компиляции, в папке с терминалом появиться новая библиотека DLL, которая будет называться так же, как проект, и еще несколько сервисных файлов Visual Studio, которые не нужны для работы библиотеки, но и мешать работе терминала не будут.
ВАЖНО. Название Qlua - скрипта не должно совпадать с именем DLL.
Для этого нужно в начало файла добавить следующую строку: "require("QluaCSharpConnector");". Таким образом функции библиотеки можно будет использовать в скрипте.
Пример обращения к функции, ранее созданной библиотеки: Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей .
Добавить комментарий Отменить ответ
Для отправки комментария вам необходимо авторизоваться.
Коннектор DLL QUIK - QLua(Lua) - C++: 83 комментария
Здравствуйте.
Помогите собрать dll библиотеку под QUIK 8.5, там Lua 5.3
Для сборки ddl под quik 8.5 и lua 5.3 нужно полностью заменить последний блок кода (регистрация названия библиотеки), например на:
Это частично помогло, но всё-равно не собирается.
Хотя в компоновщике во Вводе я вместо прежней "Дополнительной зависимости" lua5.1.lib ввел новую lua53.lib
Ошибки:
Ошибка 1 error C2079: "ls_lib" использует неопределенный struct "ls_lib"
Ошибка 2 error C2078: слишком много инициализаторов
Ошибка 3 error C3861: luaL_openlib: идентификатор не найден
В итоге скачал lua-5.1.5_Win64_vc15_lib
Вернул доп.зависимость на lua5.1.lib
Вместо вашей версии extern "c" указал прежнюю.
И собралось без ошибок, но с warning:
===
1> Создается библиотека C:\SBERBANK\QUIK_x64_RSA\connector.lib и объект C:\SBERBANK\QUIK_x64_RSA\connector.exp
1>LINK : warning LNK4098: библиотека по умолчанию "LIBCMT" противоречит использованию других библиотек; используйте параметр /NODEFAULTLIB:library
===
Мне кажется вместе с extern "c" нужно как то поменять эту строку: static struct luaL_reg ls_lib[] =
Вы не знаете что с ней не так? Я поискал в интернете - не нашёл(
Хочется таки синхронно на квиковской 5.3 работать.
У меня vs19, quik 8.7. Скачал lua-5.3.5_Win64_vc16_lib.zip, перекопировал заголовки и lib, в компоновщике прописал lua53.lib. сборка x64
Конец у кода такой:
Собирается, работает, надеюсь как-то поможет. (варнинг LINK : warning LNK4098 такой же при сборке)
Опишу всю процедуру для QUIK 8.8.4.3 (lua5.3) и MS VS 2019 Community (бесплатная)
1. Создаем новый пустой C++-проект с именем "lua_dll_x64_name" (одно имя для проекта и решения)
2. Добавляем пустой cpp-файл в раздел "Исходные файлы" с тем же именем - "lua_dll_x64_name.cpp" (в Обозревателе решений щелкаем правой клавишей мыши на "Исходные файлы" и выбираем Добавить/Создать элемент/Класс C++)
3. MS VS 2019 должен был создать для этого проекта папку lua_dll_x64_name в которой теперь пора создать папку Lua
3. Скачиваем с https://sourceforge.net/projects/luabin … es/Static/ архив "lua-5.3.5_Win64_vc16_lib.zip" и распаковываем в lua_dll_x64_name/Lua
4. В Обозревателе решений щелкаем правой клавишей мыши на "Заголовочные файлы" и выбираем Добавить/Существующий элемент. и указать из папки lua_dll_x64_name/Lua все .h- и .hpp-файлы.
7. Открыть Диспетчер конфигураций и установить x64 для Debug и Release (можно ч/з соответствующие окошки в панели инструментов)
8. Настраиваем свойства проекта (для Release и Debug устанавливаются отдельно. ). Окно свойств вызывается в Обозревателе решений щелчком правой клавишей мыши на имени проекта "lua_dll_x64_name"
- Общие/Тип конфигурации: "Динамическая библиотека (.dll)"
- Дополнительно/Набор символов: "Использовать набор символов Юникода"
- Дополнительно/Поддержка общеязыковой среды выполнения (CLR): "Без поддержки CLR-среды"
- Компоновщик/Ввод/Дополнительные зависимости/: вписать Lua\lua53.lib
- C/C++/Создание кода/Библиотека времени выполнения: Release/Debug - "Многопоточная (/MT)"/"Многопоточная отладка (/MTd)"
8. Добавьте в пока пустой файл исходного кода (lua_dll_x64_name.cpp) следующие строки:
//=== Стандартная точка входа для DLL ==========================================================================//
BOOL APIENTRY DllMain(HANDLE hModule, DWORD fdwReason, LPVOID lpReserved) return TRUE;
>
//=== Реализация функций, вызываемых из LUA ====================================================================//
static int forLua_TestFunc(lua_State* L) lua_pushstring(L, "Привет из C/C++");
return(1);
>
9. В lua-скрипте пишем следующее:
path = getScriptPath() .. "\\lua_dll_x64_name.dll"
package.loadlib(path, "luaopen_lua_dll_x64_name")()
function main()
message(lua_dll_x64_name.TestFunc())
end
Здравствуйте Дмитрий и другие авторы комментариев. Вот и я перешел на Квик вер.8.0. Перестали работать 32х разрядные ДЛЛ. Решил пересобрать ДЛЛ на 64 бита.
Сделал все как написал уважаемый ПавелИ (спасибо за подробное описание). Единственная разница - у меня Visual Studio 2015.
Так вот, у меня без ошибок собирается программа из примера только если я закомментирую одну строку:
Если я ее раскомментирую, то появляются ошибки:
LNK2019 ссылка на неразрешенный внешний символ __iob_func в функции luaL_loadfile \lua5.1.lib(lauxlib.obj) 1
LNK2019 ссылка на неразрешенный внешний символ fprintf в функции panic \lua5.1.lib(lauxlib.obj) 1
LNK2019 ссылка на неразрешенный внешний символ sprintf в функции luaO_pushvfstring \lua5.1.lib(lobject.obj) 1
В то же время функция
никаких ошибок не вызывает.
Долго бился, ничего сделать не могу. Помогите пожалуйста разобраться.
C VS 2019 тоже собралось нормально
Все сделал по указанным в статье примерам. Скрипт писался в нотепаде++ методом копипаста. Длл QluaCSharpConnector в директории Квика есть + еще 3 файла типа .pdb/.lk. Однако при запуске скрипта в квике выходит соббщение, что ДЛЛ с таким именем не найдена. В какую сторону копать, чтобы пример ваш заработал, так как у самого мысли кончились.
А Вы случайно не на 8 версии квика работаете?
Квик у меня версии 7.29.0.40 рабочий(не демка). Длл создавал для х86. Компьютер работает под 64битной виндовс 7.
Значит проблем быть не должно, скорее всего, в какой-то мелочи что-то упустили.
Дмитрий,здравствуйте. Пытаюсь пересобрать Вашу библиотеку SenderEmail.dll для Квика вер.8.0. Что-то не выходит. Сделал всё по инструкции, что написал человек в комментариях. Выдает такую ошибку в нескольких строках :
'strcat': This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. Project1 c:\users\sega\source\repos\project1\project1\project1.cpp 194
Заранее извиняюсь за наглость, но может Вы могли бы обновить архив EmailSender.zip с перекомпилированной библиотекой под х64?
Я не Дмитрий, но отвечу, надеюсь не обидитесь.
Если только эта ошибка, то используйте функцию strcat_s вместо strcat . Собственно это и предлагается сделать в описании ошибки. Функция по моему аналогична, только еще нужно передать размер. Опять таки, по моему эта ошибка не связана с разрядностью.
Да нет, что вы, какие обиды. Наоборот, спасибо за помощь.
Поправил ошибки, сейчас осталось две :
1)аргумент типа "WCHAR *" несовместим с параметром типа "const char *" Project1 C:\Users\Sega\source\repos\Project1\Project1\Project1.cpp стр.48
2)"int strcmp(const char *,const char *)": невозможно преобразовать аргумент 1 из "WCHAR [260]" в "const char *" Project1 c:\users\sega\source\repos\project1\project1\project1.cpp стр. 48
Всё в одной строке, причем если менять конфигурацию вновь на х32, то ошибка пропадает.
Здравствуйте, не пробовал еще под x64 собирать, ничего не могу подсказать
Здравствуйте.
Квик обновился до 8 версии, теперь он x64
Помогите создать в visual studio 2013 библиотеку dll
Просто сменил Release Win32 на Release x64 - не помогло.
Выдает ошибки
Ошибка 1 error LNK2001: неразрешенный внешний символ "luaL_openlib"
Ошибка 2 error LNK2001: неразрешенный внешний символ "lua_pushstring"
Либо нужны другие файлы lauxlib.h, lua.h, luaconf.h и lua5.1.lib
Либо нужно как то настроить Visual Studio 2013, но я не знаю как.
Разобрался. Что и как делал:
У меня Visual Studio 2013, на других версиях думаю так же, но не пробовал.
1. Создал проект и настроил его по инструкции как на текущей странице (только файлы брал другие см.п.2, а так же см п.3)
2. На сайте http://luabinaries.sourceforge.net/ выбрал "Lua 5.1.4 - Release 2 (sources and Visual C++ 8/9 binaries only)" Далее "Windows Libraries" и скачал "lua-5.1.4_Win64_vc12_lib.zip". Скаченные файлы разместил как в в описании.
3. В Visual Studio 2013, при настройке проекта, я изменил: Конфигурация Активная (Release) Платформа x64 (Создал через диспетчер конфигураций)
4. Код СИ скопировал для примера.
5. Проект успешно собрал, dll библиотека появилась.
6. Создал скрипт Lua, подключил через require. Запустил в QUIK 8.0.1.1 и все заработало.
Отлично, спасибо за инструкцию, думаю многим будет полезна
Подскажите, возникает ошибка
LNK1561 точка входа должна быть определена!?
в чем может быть причина..все по инструкции сделал, код из примера взял
Читайте также: