Отсутствующие имена в файле lua5.3 dll - PullRequest
4 голосов
/ 27 июня 2019

В Visual Studio (2017) я пытаюсь написать программу на C ++ с Lua 5.3, но компоновщик не находит три имени функций, на которые ссылается мой исходный файл C ++:

неразрешенный внешний символ _lua_close

неразрешенный внешний символ _lua_createtable

неразрешенный внешний символ _luaL_newstate

Я взял источник C ++ с сайта Lua .

Я скачал динамическую библиотеку Lua 5.3, которая не поставляется с библиотекой импорта, поэтому я создал библиотеку импорта с помощью инструментов MSVC, например:

dumpbin /exports E:\Documents\Programmation\Lua5.3\lua53.dll

Из вывода дампа я скопировал 146 имен вСоздайте новый файл "mylua53lib.def" и запустите lib, чтобы сгенерировать файл .lib следующим образом:

lib /def:E:\Documents\Programmation\Lua5.3\mylua53lib.def /OUT:E:\Documents\Programmation\Lua5.3\mylua53lib.lib /machine:x86

Три имени функции, которые не найдет компоновщик, действительно не отображаются в выходных данных команды dumpbin.

1 Ответ

1 голос
/ 27 июня 2019

Двоичный дистрибутив Lua, предназначенный для динамической компоновки в Windows, должен поставляться с двумя двоичными файлами:

  • файл DLL с актуальным кодом Lua
  • файл библиотеки с делегированием заглушек метода в DLL

Иногда файл библиотеки будет иметь расширение .a, что более распространено в Linux (в отличие от .lib в Windows). Однако, если это сборка Windows, вы можете просто передать этот файл как зависимость компоновщика, и он будет работать нормально. Этот вопрос касается различий между двумя конвенциями.

В качестве дополнительного примечания, чтобы заставить его работать, если вы создадите проект C ++ в Visual Studio и добавите Source.cpp, как это предлагается по умолчанию, вы все равно получите неразрешенные внешние компоненты. Это связано с тем, что хотя исходники C компилируются в виде кода C ++ просто отлично, компоновщик будет ожидать искаженных имен для определений используемых функций C. Этого можно избежать, скомпилировав файл в виде кода на C, или, предпочтительно, сообщив ему, что имена из заголовков Lua должны быть разобраны в связанной библиотеке с помощью extern "C":

extern "C" {

#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
#include <stdlib.h>
#include <stdio.h>

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...