いくつかのコンテキスト:WindowsでPelles C(Cを使用)を使用して、LuaソースをDLLにビルドしようとしています(学習目的!)。それが重要な場合は、主にx64をターゲットにします。
私のPellesCでDLLウィザードを使用すると、サンプル関数とDLLMain.hを使用してDLLMain.cが自動生成されます。これは問題ありませんが、他のすべてのlua関数もエクスポートする方法がわかりません。Lua Webサイトから指示されたすべてのソースファイル(単純すぎて機能しない可能性がありますが、わかりません...)を追加し、適切な#define
sを使用してビルドすると、サンプル関数がエクスポートされます。 polib.exe:
いくつかの情報源:
自動生成されたDLLメイン:
/****************************************************************************
* *
* 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;
}
Autで生成されたヘッダー:
// 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
これらの定義は、定義されているシンボルに応じて、luaapi呼び出しがどのように構築されるかを決定します。そのため、ヘッダーファイルに追加しました。
自動生成されたheader/cファイルに関数を追加すると、polib.exeに従ってlibに表示されます。これにより、すべての関数呼び出しを見つけてdllmainファイルに移動する必要があると思いますが、これを行うのに最適な方法とは思えません。
これらの情報源は実際にはこの質問に答えていませんでした:
各静的ライブラリがエクスポートされた機能(vc ++ 2008)を定義している場合、複数の静的リンクライブラリを単一のdllにどのようにマージしますか?
〜私が見つけたすべてのチュートリアルは、単一ファイルのDLLチュートリアルです。
〜これは近づいてきましたが、私が必要とする線に沿って答えはありません。
〜LuaのWebサイトとビルドのドキュメントは、Windowsに関してはあまり明確/具体的ではありません。
私がかなり明白な何かを見逃している可能性は完全にあります。最初にシングルソース/シングルヘッダーファイルDLLを調べて、その感触をつかみました。次に、Luaのコンパイルを試してみたいと思います(実際、ある時点で学びたいと思っています)。この質問が少し複雑かどうか教えてください。LuaではなくDLLの知識に問題があると思うので、私の質問は次のとおりです。
複数のファイルにエクスポートされる関数を含む、複数のソースファイルを含むDLLファイルをどのように作成しますか?
PS:それが根本的な原因である可能性がある場合、このトピックに関して私が見逃している基本的なノウハウは何ですか?また、長さでごめんなさい....ちょうど気づいた...
編集:解決しました!泥ありがとうございます。
方法:Pelles Cで、[プロジェクトオプション...]-> [コンパイラ]タブに移動し、行の下にLUA_BUILD_AS_DLL LUA_LIB
(またはLUA_BUILD_AS_DLL LUA_CORE
または)と入力します。LUA_BUILD_AS_DLL LUA_CORE LUA_LIB
Define preprocessor symbols