某些上下文:我正在尝试使用Pelles C(使用C)在Windows上将Lua源构建为DLL(学习目的!)。主要针对x64,如果这很重要的话。
通过在Pelles C中使用DLL向导,它使用示例函数和DLLMain.h自动生成DLLMain.c。这很好,除了现在我不知道如何导出所有其他lua函数。简单地添加Lua网站告诉我然后用适当的#define
构建它的所有源文件(这太简单,可能无法工作,但你永远不知道......)只导出样本函数,我已经使用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文件,但这听起来不是最佳方法。
这些消息来源并未真正回答这个问题:
would appreciate for some one pointing me to good DLL tutorial
〜我找到的所有教程都是单文件DLL教程。
Compiling & Decompiling dll files
〜这个问题很接近,但我没有答案。
~Laa网站和build documentation在Windows方面不是非常明确/具体。
我完全有可能错过一些非常明显的东西。我首先通过单源/单头文件DLL来感受它,现在我想尝试编译Lua(我实际上想在某个时候尝试学习)。如果这个问题有点令人费解,请告诉我。我认为这是我的DLL知识的问题,而不是Lua,所以我的问题是:
如何构建包含多个源文件的DLL文件,并将函数导出到多个文件中?
PS:如果这可能是根本原因,我对这个话题缺少哪些基础知识?还有,抱歉长度......刚刚注意到......编辑:解决了!谢谢你。
方法:在Pelles C中,转到项目选项... - &gt; “编译器”标签,然后在LUA_BUILD_AS_DLL LUA_LIB
行下输入LUA_BUILD_AS_DLL LUA_CORE
(或LUA_BUILD_AS_DLL LUA_CORE LUA_LIB
或Define preprocessor symbols
)。
答案 0 :(得分:1)
您要导出的所有Lua API函数都以LUA_API为前缀。如您所述,要正确定义LUA_API(对于Visual Studio,GCC等),您只需要定义LUA_BUILD_AS_DLL和LUA_LIB。
但是,您在头文件中定义它们,因此这些定义仅存在于包含该标题的文件中 - 即没有任何Lua文件包含您的标题。
您需要在project-settings / makefile /中定义这些符号,以便在编译Lua源时定义它们。