一、编写 sourceFile XXX.c
1、A.c

2、 B.c

3、Main.c

二、Build dylib
2.1 生成动态库: gcc -dynamiclib A.c -o libA.dylib
-dynamiclib 表示将A.c B.c编译成一个动态库
-o libA.dylib 用于指定生成的动态库的名称

2.2 编译可执行文件 gcc Main.c -L. -lA -lB -o main
-L. 指定当前目录为链接时动态库的查找目录
-lA 指定要链接的动态库为libA.dylib
-lB 指定要链接的动态库为libB.dylib
-o main 指定生成的可执行文件名称为main

直接点击运行可执行文件时出现dyld: Library not loaded:
2.3、运行可执行文件 ./main
在当前目录下执行main,注意要加上 ./

三、otool
3.1、install_name
(Note:只有动态库才有install_name,应用程序如果引用了某一个动态库,则会在链接时记录该动态库的install_name)
每个动态库(dylib)都有一个install_name,可以认为是动态库初次安装时的默认路径,这个install_name保存在dylib文件中。
3.2 、show all dylib
otool -L main

3.3、 show the id of dylib
查看dylib的install_name
otool -D <dylib>

3.4、 change the id of dylib
install_name_tool -id <new name> <dylib>
更新 install_name_tool of libA.dylib 到 ../libA.dylib
Example: install_name_tool -id ../libA.dylib libA.dylib

3.5 、Change the path where executable find the dylib
install_name_tool -change <old value> <new value> <executable>
Example: install_name_tool -change libA.dylib ../libA.dylib main
注意:还有一个方法,如果dylib的install_name不正确,将环境变量$DYLD_LIBRARY_PATH设置为dylib所在的路径可以让可执行文件成功找到dylib.
四、dylib 引用
4.1、链接是引用
1、 编译:gcc Main.c -L. -lA -lB -o main
2、执行:./main
3、动态库移动到上一级目录:mv libA.dylib ..
4、编译失败:gcc Main.c -L. -lA -lB -o main
5、动态库移动回当前目录:mv ../libA.dylib .
6、再次编译成功:gcc Main.c -L. -lA -lB -o main
7、再执行:./main

在执行上述链接过程时,编译器顺便将动态库libA.dylib、libB.dylib 的install_name记录到了main程序中,用来在运行时查找并引用该动态库。
4.2、运行时引用
后续
网友评论