amxx模块开发入门005-开启METAMOD和编译方法
条评论在当前版本的amxmodx模块开发时,我们可能需要用到METAMOD的一些HOOK功能,那么我们就需要先开启METAMOD功能,然后再按照需要逐个开启METAMOD下的HOOK功能。
开启方法
在moduleconfig.h中,找到USE_METAMOD
1 | // #define USE_METAMOD |
把前边的注释去掉即可开启(这是总开关,如果需要用到其他HOOK功能,也是在这里找到相应的HOOK功能,把注释去掉,接着在你的cpp文件中实现该HOOK功能的函数即可)
1 |
编译方法
使用AMBuild编译(Windows)
打开模块项目下的AMBuilder,在AMXX.modules += [builder.Add(binary)]之前加上以下内容:
1 | if builder.target_platform == 'windows': |
这里说的只是windows平台需要加上'/EXPORT:GiveFnptrsToDll=_GiveFnptrsToDll@8,@1',如果是linux平台是不需要加这个的。同样的在windows下,我们使用Visual Studio来进行编译时,也需要在附加选项中加上这条语句。
使用Visual Studio 2017编译
如果你开启了METAMOD功能,则需要在“附加选项”中,填入以下内容才能正常编译,反过来,如果你没有开启METAMODE功能,你需要在“附加选项”中,去掉以下的内容:
1 | /EXPORT:GiveFnptrsToDll=_GiveFnptrsToDll@8,@1 %(AdditionalOptions) |
附加选项说明
这是chatgpt给出的回答,大家可以参考一下:
这段代码是Microsoft Visual C++编译器的链接选项之一,用于控制导出函数名的名称修饰方式。
在Windows下,函数名导出时会被自动加上一个名称修饰(name decoration),用于标识函数的参数类型和返回值类型。这样做是为了支持函数重载,但是导出的函数名称对于外部调用者来说可能不太友好,也不太容易记忆和理解。为了解决这个问题,Windows提供了一个链接选项“/EXPORT”,可以手动指定导出函数的名称及其名称修饰方式。
在这段代码中,/EXPORT选项的语法为“/EXPORT:function=decorated_function_name”,其中“function”是导出的函数名称,而“decorated_function_name”是修饰后的函数名称。
具体来说,“GiveFnptrsToDll”是要导出的函数名称,而“_GiveFnptrsToDll@8”则是修饰后的函数名称。这个名称修饰方式是标准的C++名称修饰方式(又称为C++ name mangling),表示函数的名称是“_GiveFnptrsToDll”,参数列表的总大小是8个字节(因为这个函数有两个int类型的参数,每个参数占4个字节)。
另外,“@1”是一个特殊的导出名称,它表示这个函数是一个常量,通常用于导出常量数据。这个名称修饰方式是Windows API的标准名称修饰方式之一,表示这个导出的名称是“_1”。
参考文献
Module Writing (AMX Mod X)
AMX Mod X Documentation
AMX X Documentation - API