一些上下文:我正在尝试将 Lua 源代码构建为 DLL(学习目的!),在 Windows 上使用 Pelles C(使用 C)。主要针对 x64,如果这很重要的话。
通过在我的 Pelles C 中使用 DLL 向导,它会自动生成带有示例函数和 DLLMain.h 的 DLLMain.c。这很好,除了现在我不确定如何导出所有其他 lua 函数。只需添加 Lua 网站告诉我的所有源文件(这太简单了,不可能工作,但你永远不知道......)然后用适当#define
的 s 构建它只是导出示例函数,我已经使用它检查过polib.exe:
一些来源:
自动生成的 DLL main:
/****************************************************************************
* *
* File : dllmain.c *
* *
* Purpose : Generic Win32 Dynamic Link Library (DLL). *
* *
* History : Date Reason *
* 00/00/00 Created *
* *
****************************************************************************/
#define WIN32_LEAN_AND_MEAN /* speed up */
#include <windows.h>
#include <windowsx.h>
#include <commctrl.h>
#include <tchar.h>
/*
* Include our "interface" file and define a symbol
* to indicate that we are *building* the DLL.
*/
#define _LUADLLTE_
#include "LUADLLTE.h"
//!!!~~~!!!~~~!!!~~~!!!~~~!!!~~~!!!~~~!!!~~~!!!
#include "lua.h" //I added these 3. Do these not go here?
#include "lauxlib.h" //They are the 3 headers that every Lua tutorial
#include "lualib.h" //includes.
//~~~!!!~~~!!!~~~!!!~~~!!!~~~!!!~~~!!!~~~!!!~~~
/****************************************************************************
* *
* Function: DllMain *
* *
* Purpose : DLL entry and exit procedure. *
* *
* History : Date Reason *
* 00/00/00 Created *
* *
****************************************************************************/
BOOL APIENTRY DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
/*
* Microsoft says:
*
* blah comments blah
*/
break;
case DLL_THREAD_ATTACH:
/*
* Microsoft says:
*
* blah blah
*/
break;
case DLL_THREAD_DETACH:
/*
* blah blah
*/
break;
case DLL_PROCESS_DETACH:
/*
* blah
*/
break;
}
/* Return success */
return TRUE;
}
/****************************************************************************
* *
* Function: SampleFunction *
* *
* Purpose : Sample function which does nothing useful. *
* *
* History : Date Reason *
* 00/00/00 Created *
* *
****************************************************************************/
LUADLLTEAPI int WINAPI SampleFunction(int a, int b)
{
/* TODO: Replace with your own code */
return a * b;
}
自动生成的标头:
// INCLUDE FILE generated by "Pelles C for Windows, version 3.00".
#ifndef _LUADLLTE_H
#define _LUADLLTE_H
#ifdef _LUADLLTE_
#define LUADLLTEAPI __declspec(dllexport)
//!!!~~~!!!~~~!!!~~~!!!~~~!!!~~~!!!~~~!!!~~~!!!
#define LUA_BUILD_AS_DLL //I added these 3 defines as well.
#define LUA_CORE //See next source excerpt for the
#define LUA_LIB //reasoning.
//!!!~~~!!!~~~!!!~~~!!!~~~!!!~~~!!!~~~!!!~~~!!!
#else
#define LUADLLTEAPI __declspec(dllimport)
#endif /* _LUADLLTE_ */
#ifndef WINAPI
#define WINAPI __stdcall
#endif
LUADLLTEAPI int WINAPI SampleFunction(int, int);
#endif /* _LUADLLTE_H */
luaconf.h,相关(我认为?)部分:
/*
@@ LUA_API is a mark for all core API functions.
@@ LUALIB_API is a mark for all auxiliary library functions.
@@ LUAMOD_API is a mark for all standard library opening functions.
** CHANGE them if you need to define those functions in some special way.
** For instance, if you want to create one Windows DLL with the core and
** the libraries, you may want to use the following definition (define
** LUA_BUILD_AS_DLL to get it).
*/
#if defined(LUA_BUILD_AS_DLL) /* { */
#if defined(LUA_CORE) || defined(LUA_LIB) /* { */
#define LUA_API __declspec(dllexport)
#else /* }{ */
#define LUA_API __declspec(dllimport)
#endif /* } */
#else /* }{ */
#define LUA_API extern
#endif /* } */
/* more often than not the libs go together with the core */
#define LUALIB_API LUA_API
#define LUAMOD_API LUALIB_API
这些定义决定了如何构建 lua api 调用,具体取决于定义的符号。这就是我将它们添加到头文件中的原因。
我可以将函数添加到自动生成的 header/c 文件中,它们将根据 polib.exe 显示在 lib 中。这让我认为我需要找到每一个函数调用并将其移动到 dllmain 文件中,但这听起来并不是执行此操作的最佳方法。
这些消息来源并没有真正回答这个问题:
鉴于每个静态库都定义了导出的功能(vc++ 2008),如何将多个静态链接库合并到一个 dll 中?
~我找到的所有教程都是单文件DLL教程。
〜这个接近了,但没有我需要的答案。
~当涉及到 Windows 时,Lua 网站和构建文档不是很清楚/具体。
我完全有可能遗漏了一些非常明显的东西。我首先通过单源/单头文件 DLL 来感受它,现在我想尝试编译 Lua(我实际上想在某个时候尝试了解)。让我知道这个问题是否有点令人费解。我认为这是我的 DLL 知识的问题,而不是 Lua,所以我的问题是:
如何构建包含多个源文件的 DLL 文件,并在多个文件中导出函数?
PS:我在这个话题上缺少什么基本知识,如果这可能是根本原因?另外,对不起,长度......刚刚注意到......
编辑:解决了!谢谢泥。
方法:在 Pelles C 中,转到 Project Options... -> Compiler 选项卡,然后在该行下输入LUA_BUILD_AS_DLL LUA_LIB
(或LUA_BUILD_AS_DLL LUA_CORE
或LUA_BUILD_AS_DLL LUA_CORE LUA_LIB
) 。Define preprocessor symbols