设为首页收藏本站新闻投稿

MOD中国同盟社

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 919|回复: 9

谁用过PAWN嵌入C++程序?怎么编译呢?已解决 [复制链接]

Rank: 1

帖子
7
精华
0
声望
24 点
金币
3 Mold
被赞许
0 次
注册时间
2011-9-30
发表于 2011-9-30 19:35:24 |显示全部楼层
本帖最后由 angluca 于 2011-9-30 23:55 编辑

同上
#include <stdio.h>
#include <stdlib.h>     /* for exit() */
#include <string.h>     /* for memset() (on some compilers) */
#include <amx.h>
#include <amxcore.c>
#include <amxaux.c>

void ErrorExit(AMX *amx, int errorcode)
{
  printf("Run time error %d: \"%s\" on address %ld\n",
         errorcode, aux_StrError(errorcode),
         (amx != NULL) ? amx->cip : 0);
  exit(1);
}

void PrintUsage(char *program)
{
  printf("Usage: %s <filename>\n<filename> is a compiled script.\n", program);
  exit(1);
}

int main(int argc,char *argv[])
{
  extern AMX_NATIVE_INFO console_Natives[];
  extern AMX_NATIVE_INFO core_Natives[];

  AMX amx;
  cell ret = 0;
  int err;

  if (argc != 2)
    PrintUsage(argv[0]);

  err = aux_LoadProgram(&amx, argv, NULL);
  if (err != AMX_ERR_NONE)
    ErrorExit(&amx, err);

  amx_Register(&amx, console_Natives, -1);
  err = amx_Register(&amx, core_Natives, -1);
  if (err)
    ErrorExit(&amx, err);

  err = amx_Exec(&amx, &ret, AMX_EXEC_MAIN);
  if (err)
    ErrorExit(&amx, err);
  printf("%s returns %ld\n", argv, (long)ret);

  aux_FreeProgram(&amx);
  return 0;
}


但不知道怎么编译,找不到函数符号,加了amx32w.lib也一样..谁能告诉我怎么编译.
还有怎么在C程序里调用脚本语言,脚本语言里调用C程序里的函数..
求 教, 有小源码例子更好, 谢谢了..

使用道具 举报

Rank: 3Rank: 3

帖子
28
精华
0
声望
488 点
金币
30 Mold
被赞许
0 次
注册时间
2011-5-23
发表于 2011-9-30 21:33:37 |显示全部楼层
很有意思,我也想研究试试,谢谢你提供了amx32w.lib搜索资料

使用道具 举报

Rank: 1

帖子
7
精华
0
声望
24 点
金币
3 Mold
被赞许
0 次
注册时间
2011-9-30
发表于 2011-9-30 22:25:21 |显示全部楼层
没有人用这个嵌入小程序之类的么? 郁闷...找不到相关资源,难道这个PAWN脚本很冷门?

使用道具 举报

Rank: 3Rank: 3

帖子
28
精华
0
声望
488 点
金币
30 Mold
被赞许
0 次
注册时间
2011-5-23
发表于 2011-9-30 22:31:51 |显示全部楼层
我从没见过用C文件用预编译,#include <amxaux.c>

使用道具 举报

Rank: 1

帖子
7
精华
0
声望
24 点
金币
3 Mold
被赞许
0 次
注册时间
2011-9-30
发表于 2011-9-30 22:37:51 |显示全部楼层
本帖最后由 angluca 于 2011-9-30 22:58 编辑

这是源码里的奈示例文件 现在我改成了 amxaux.h

我把AMX文件夹几个需要的文件都放在工程里了 然后编译只有2个错误了.LIB文件加不加都无所谓都一样的编译结果 QQ截图20110930223531.jpg

编译 帮助里也没写明白也没小例子.自己GOOGLE找又没找到.

使用道具 举报

Rank: 1

帖子
7
精华
0
声望
24 点
金币
3 Mold
被赞许
0 次
注册时间
2011-9-30
发表于 2011-9-30 22:56:47 |显示全部楼层
本帖最后由 angluca 于 2011-10-1 01:48 编辑

编译完成-.-  这是全代码,这个终于能编译过去了.
/*  Command-line shell for the "awn" Abstract Machine.
*
*  Copyright (c) ITB CompuPhase, 2001-2010
*
*  This file may be freely used. No warranties of any kind.
*/
#include <stdio.h>
#include <stdlib.h>     /* for exit() */
#include <string.h>     /* for memset() (on some compilers) */
#include "amx/amx.h"
#include "amx/amxaux.h"

void ErrorExit(AMX *amx, int errorcode)
{
  printf("Run time error %d: \"%s\" on address %ld\n",
         errorcode, aux_StrError(errorcode),
         (amx != NULL) ? amx->cip : 0);
  exit(1);
}

void PrintUsage(char *program)
{
  printf("Usage: %s <filename>\n<filename> is a compiled script.\n", program);
  exit(1);
}

extern "C" AMX_NATIVE_INFO console_Natives[];
extern "C" AMX_NATIVE_INFO core_Natives[];
int main(int argc,char *argv[])
{

  AMX amx;
  cell ret = 0;
  int err;

  if (argc != 2)
    PrintUsage(argv[0]);

  err = aux_LoadProgram(&amx, argv, NULL);
  if (err != AMX_ERR_NONE)
    ErrorExit(&amx, err);

  amx_Register(&amx, console_Natives, -1);
  err = amx_Register(&amx, core_Natives, -1);
  if (err)
    ErrorExit(&amx, err);

  err = amx_Exec(&amx, &ret, AMX_EXEC_MAIN);
  if (err)
    ErrorExit(&amx, err);
  printf("%s returns %ld\n", argv, (long)ret);

  aux_FreeProgram(&amx);
  scanf("%d\n",&err);
  return 0;
}


使用道具 举报

Rank: 1

帖子
7
精华
0
声望
24 点
金币
3 Mold
被赞许
0 次
注册时间
2011-9-30
发表于 2011-9-30 23:08:17 |显示全部楼层
不过拖入脚本文件会出错- -,哎,这是官方示例,不知道怎么搞了,求教程,小例子.

使用道具 举报

Rank: 1

帖子
7
精华
0
声望
24 点
金币
3 Mold
被赞许
0 次
注册时间
2011-9-30
发表于 2011-9-30 23:36:13 |显示全部楼层
本帖最后由 angluca 于 2011-9-30 23:51 编辑

终于解决了,显示出脚本结果了,刚不小心用了别的脚本调用了程序内没有的的函数所以出错.test.p:
main()
    printf "Hello world\n"


编译成.amx文件然后拖入程序内 或者 命令行内输入 pawntest 脚本名.amx       (pawntest就是这个程序的名字)
结果:
23.jpg


使用道具 举报

Rank: 3Rank: 3

帖子
28
精华
0
声望
488 点
金币
30 Mold
被赞许
0 次
注册时间
2011-5-23
发表于 2011-10-1 00:10:54 |显示全部楼层
哇,我想要点资料哦
这个用C写内存池,直接调用*.amx文件函数相信也可以。不过对比生成动态链接库,它没什么优点吧?

使用道具 举报

Rank: 1

帖子
7
精华
0
声望
24 点
金币
3 Mold
被赞许
0 次
注册时间
2011-9-30
发表于 2011-10-1 01:43:15 |显示全部楼层
脚本的优点就是随时都能改呗,改完了要脚本重载一下,就可以不用重新去编译工程文件而运行你想要的结果.
PAWN的优点就是速度快,就是感觉文档很少,网上完全找不到什么例子,源码里的例子也是相当的少,异常都得自己写出来,不然调用了没有的函数之类的就会异常关闭程序.
而动态库,你卸载后不一定能重新加载,而且也只能取里面函数来用用,脚本的话还能让你的程序能直接编译加载,就是不用自己去生成AMX了.PC_COMPILER这个函数就是,PAWN还有很多要研究,哎..主要是例子太少.相比其它脚本语言真是太劣势了. 像LUA的文章一搜一大把现在.

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

回顶部