1.首先是构建一个函数库
编辑add.c
int add(int a,int b)
{
return a+b
}
int axb(int a,int b)
{
return a*b
}
保存
其中两个函数 add axb
这是简单的写的,复杂的自己开发,这里主要介绍方法
2.编译函数库
gcc -c add.c -o add.o
//下面是linux系统时
ar rcs libadd.a add.o
//如果你是linux 就用这种库
//下面是Mac OSX
gcc add.o -dynamiclib -current_version 1.0 -o libadd.dylib
得到 libadd.dylib
3.编辑testadd.c
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
int main(int argc,char *argv[])
{
int a,b
a=10
b=9
int c
c=add(a,b)
printf("%d\n",c)
return 1
}
保存
4.编译testadd.c
gcc testadd.c -o testadd -L. -ladd
./testadd
输出19
5.编辑dladd.c
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
int main(int argc,char *argv[])
{
int *ab
void *h=dlopen("./libadd.dylib",RTLD_LAZY)
ab=dlsym(h,"add")
printf("add=address is 0x %x\n",ab)
dlclose(h)
return 1
}
这个是为了查看函数库在库中的地址的
6.编译dladd.c
gcc dladd.c -o dladd -ldl
./dladd
add=address is 0x 23fe2
这是输出的地址了
一下内容为另一篇文章提取出来的:http://blog.csdn.net/leonpengweicn/article/details/7427621
上面说的如何在代码里调用,貌似有些含糊不清,下面是调用的示例:
NSString *dyPath = @"/pengpeng/temp/libadd.dylib"//这是生成的.dylib文件的位置
void *handle = dlopen([dyPath cStringUsingEncoding:NSUTF8StringEncoding], RTLD_LAZY)
if (handle) {
NSLog(@"open dylib success")
int (*function)(int a,int b) = dlsym(handle, "add")//add为方法名,这里用函数指针
if (function) {
NSLog(@"open function success,1+1=%d",function(1,1))
}
dlclose(handle)
}
1.使用otool -L 查看运行程序依赖路径。
例1:otool -L xxx.app/Contents/MacOS/xxx
例2:otool -L xxx.dylib.com
2.修改.app工程.dylib库依赖路径:install_name_tool -change 旧.dylib库路径 新.dylib库路径 xxx.app/Contents/MacOS/xxx
例:install_name_tool -change /usr/local/libcrypto.1.0.0.dylib /Library/xxx/xxx/extlib/libcrypto.1.0.0.dylib xxx.app/Contents/MacOS/xxx
注:@executable_path:可执行文件所在的目录。可使用@executable_path设置引用库的相对路径,@executable_path/../../../extlib/libcrypto.1.0.0.dylib
@loader_path. @rpath
3.修改.dylib库依赖路径:install_name_tool -id 要使用的路径 旧路径
例:install_name_tool -id /Library/xxx/xxx/extlib/libcrypto.1.0.0.dylib libcrypto.1.0.0.dylib
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)