尝试了用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了
|