分享

Mac os x 加载 dylib

 qiujingLib 2012-04-18

尝试了用dlopen,基本上跟dll是一个套路

首先,dylib项目 
------------------- 华丽的分隔线 -------------------- !
// MyDynamic.h 
#ifndef MyDynamic_
#define MyDynamic_

namespace
{
    __attribute__ ((visibility("default"))) void myFunc(void *params);  
}
__attribute__ ((visibility("default"))) void globalFunc(void *params);
 
#endif
------------------- 华丽的分隔线 -------------------- 
// MyDynamic.cpp
#include "MyDynamic.h" 
 
#include <stdio.h> 
__attribute__ ((visibility("default"))) void me::myFunc(void *params) 
{
    printf("Hey!!!!!!!!!!!!!!!!!!\n");

__attribute__ ((visibility("default"))) void globalFunc(void *params) 
{
    printf("Yo!!!!!!!!!!!!!!!!!!\n"); 

------------------- 华丽的分隔线 -------------------- _

这里各实现了一个有命名空间和无命名空间的函数
编译好后应该在Products文件夹里就能找到MyDynamic.dylib了 
为了加载方便,把它拷到/Developer/Projects/lib/ 

接下来就是分析符号了
将MyDynamic.dylib改成MyDynamic.txt,打开后可以发现两个函数分别对应下面两个符号  
函数前面的数字应该是指名称的长度 
最后在主程序里读文件,读符号就OK了

------------------- 华丽的分隔线 --------------------  
#include <stdio.h>
#include <dlfcn.h>
typedef void (*Function)(void *params); 
 
int main (int argc, const char * argv[]) 

    void *handle = dlopen("/Developer/Projects/lib/MyDynamic.dylib", RTLD_NOW | RTLD_GLOBAL);
     dXfLN<nD>U 
    Function func1 = (Function)dlsym(handle, "_ZN2me6myFuncEPv");
    Function func2 = (Function)dlsym(handle, "_Z10globalFuncPv");  
    func1(0);
    func2(0);
    getchar(); 
    return 0; 

------------------- 华丽的分隔线 -------------------- 

跟dll一样,只能执行函数,无法创造类的对象 
创造类对象得靠Bundle了

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多