browser icon
You are using an insecure version of your web browser. Please update your browser!
Using an outdated browser makes your computer unsafe. For a safer, faster, more enjoyable user experience, please update your browser today or try a newer browser.

用 AWK 自动生成模块定义(.def)文件

Posted by on 2014 年 09 月 02 日

你可以任意转载本文,但请在转载后的文章中注明作者和原始链接。
媒体约稿请联系 titilima_AT_163.com(把“_AT_”换成“@”)。

编写 DLL 的时候,如果导出的函数过多,就往往会在编写 .def 文件的步骤大费周章,唯恐遗漏掉哪个函数。在这种情况下,就需要借助代码来处理这个文件了。嗯,AWK 是一个很赞的选择。

在这整个的处理过程中,最核心的技巧其实就是从头文件中提取所有的导出函数名称。为了便于提取,就需要统一函数的声明格式,这样才能使正则表达式发挥最大的威力。考虑下面的例子:

int MYAPI MyLibFoo1(int arg1);
int MYAPI MyLibFoo2(int arg1, int arg2);

当然,所有含有导出函数声明的头文件肯定是约定俗成地被放在某个目录下,比如 include。

接下来就是用于生成 .def 的 AWK 脚本了,如下:

1
2
3
4
5
6
7
8
# def_gen.awk
BEGIN { printf("LIBRARY \"MyLib\"\n\nEXPORTS\n\n") }
 
{
    if (0 != match($0, /MYAPI (MyLib.*)\(/, mr)) {
        printf("%s\n", mr[1])
    }
}

然后在 Cygwin 下执行这个脚本:

awk -f def_gen.awk path/to/include/*.h > MyLib.def

简单说明一下:

  1. BEGIN 语句块在整个的 AWK 扫描过程中只执行一次,因此可以用来输出 .def 的头信息。
  2. match 是正则表达式的匹配函数,所有匹配结果放在第三个参数之中。

订阅本站

没有评论

(Required)
(Required, will not be published)