加载插件(二)之静态加载

举个例子来说明插件的加载,以核心插件为例,它在libvlc_new中执行,流程如下:
这里写图片描述

上图中的vlc_entry__core是一个函数指针,定义在modules.h中:

/** Core module */
int vlc_entry__core (int (*)(void *, void *, int, ...), void *);

那么vlc_entry__core 定义在哪里呢,为什么调用它会跳到libvlc_module.c的vlc_module_begin()那里,我们先来看下vlc_module_begin()的代码:

vlc_module_begin ()
    set_category( CAT_AUDIO )
    set_subcategory( SUBCAT_AUDIO_GENERAL )
    add_category_hint( N_("Audio"), AOUT_CAT_LONGTEXT , false )
    中间的设置非常多!!!
vlc_module_end ()

vlc_module_begin 实际上是一个宏,如下:

#define vlc_module_begin() \
EXTERN_SYMBOL DLL_SYMBOL \
int CDECL_SYMBOL __VLC_SYMBOL(vlc_entry) (vlc_set_cb, void *); \
EXTERN_SYMBOL DLL_SYMBOL \
int CDECL_SYMBOL __VLC_SYMBOL(vlc_entry) (vlc_set_cb vlc_set, void *opaque) \
{ \
    module_t *module; \
    module_config_t *config = NULL; \
    if (vlc_plugin_set (VLC_MODULE_CREATE, &module))  \
        goto error; \
    if (vlc_module_set (VLC_MODULE_NAME, (MODULE_STRING))) \
        goto error;

其中EXTERN_SYMBOL等大部分的宏展开其实都为空,把空的去掉是怎样的:

int __VLC_SYMBOL(vlc_entry) (vlc_set_cb, void *);
int __VLC_SYMBOL(vlc_entry) (vlc_set_cb vlc_set, void *opaque) \
{ \
    module_t *module; \
    module_config_t *config = NULL; \
    if (vlc_plugin_set (VLC_MODULE_CREATE, &module))  \
        goto error; \
    if (vlc_module_set (VLC_MODULE_NAME, (MODULE_STRING))) \
        goto error;

其中__VLC_SYMBOL为

#define CONCATENATE( y, z ) CRUDE_HACK( y, z )
#define CRUDE_HACK( y, z )  y##__##z
#   define __VLC_SYMBOL( symbol )  CONCATENATE( symbol, MODULE_NAME )

而MODULE_NAME 为

#define MODULE_NAME core

看下全部展开:

int vlc_entry__core (vlc_set_cb, void *);
int vlc_entry__core (vlc_set_cb vlc_set, void *opaque) \
{ \
    module_t *module; \
    module_config_t *config = NULL; \
    if (vlc_plugin_set (VLC_MODULE_CREATE, &module))  \
        goto error; \
    if (vlc_module_set (VLC_MODULE_NAME, (MODULE_STRING))) \
        goto error;

这下应该明白了,vlc_module_begin实际上就是vlc_entry__core。
再看下vlc_module_end,这个比较简单:

#define vlc_module_end() \
    (void) config; \
    return 0; \
error: \
    return -1; \
} \
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值