怎样创建可供Lua调用的C dll,typedef的语法(函数指针,返回值为const char *)有什么问题

(我正在使用Visual Studio 2015 Professional)

首先,我想知道从C dll中导入函数的正确方法是否为:创建指向它们的指针,并通过'LoadLibrary'和'GetProcAddress'分配这样指针的值。我尝试这样做是因为我无法正确地构建我的C代码并从Lua交互式控制台调用它。这是一个令人绝望的尝试。然而,我得到了下面的错误,希望能够理解。

其次,我不知道如何纠正这个警告: 'C4090:'function'与'const'限定符不同'

这是我尝试编译的dll的缩短版本。

'``` //stdafx.h #pragma once

#include"targetver.h"

#define WIN32_LEAN_AND_MEAN //从Windows头文件中排除不常用的东西

#ifdef __cplusplus extern "C" { #endif #include <lua.h> #include <lualib.h> #include <lauxlib.h> #include <windows.h> #include <stdlib.h>

typedef const char * ( CALLBACK* luafnptr_typename ) ( lua_State *L, int tp ); #ifdef __cplusplus } #endif '```

以及这个代码文件:

'``` //dllmain.c #include"stdafx.h"

HINSTANCE hDLL; luafnptr_typename l_typename = NULL;

BOOL load ( ); BOOL unload ( );

BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: return load ( ); case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: return unload ( ); break; } }

BOOL load ( ) { hDLL = LoadLibrary ( "C:/Lua/5.2.4/lua5.2.4.dll" ); if ( hDLL != NULL ) { l_typename = ( luafnptr_typename ) GetProcAddress ( hDLL, "lua_typename" ); if ( !l_typename ) { FreeLibrary ( hDLL ); return FALSE; } } return TRUE; }

BOOL unload ( ) { free ( l_typename );// <<< 此行报告警告 l_typename = NULL; return TRUE; }

'```

最后,我也得到了许多“LNK2001 unresolved external symbol [X]”和“LNK2019 unresolved external symbol [X] referenced in function [Y]”这样的错误。

例如:

'LNK2001:unresolved external symbol _floor LuaExperiment C:\Users\Kauan\Documents\Visual Studio 2015\Projects\LuaExperiment\LuaExperiment\lua5.2.4-static.lib(lvm.obj)'

以及:

'LNK2019:unresolved external symbol _floor referenced in function _luaO_arith LuaExperiment C:\Users\Kauan\Documents\Visual Studio 2015\Projects\LuaExperiment\LuaExperiment\lua5.2.4-static.lib(lobject.obj)'

我只是通过进入“Project->Properties->Linker->Input->Aditional Dependencies->Edit…”将Lua添加到项目中,并添加了值'C:\Lua\5.2.4*.lib',没有其他内容。

点赞