@executable_path - ShenYj/ShenYj.github.io GitHub Wiki
executable_path
: 标识可执行程序所在的目录,解析为可执行文件的绝对路径
延续 链接framework动态库 和 @rpath 的基础上
-
将
test
可执行文件的rpath
修改成executable_path
install_name_tool -rpath /Users/shenyj/framework动态库 @executable_path test
-
再来查看
test
可执行文件的RPATH
❯ otool -l test | grep 'RPATH' -A 5 cmd LC_RPATH cmdsize 32 path @executable_path (offset 12)
-
lldb
下运行❯ lldb -file test (lldb) target create "test" Current executable set to '/Users/shenyj/framework动态库/test' (x86_64). (lldb) r Process 93509 launched: '/Users/shenyj/framework动态库/test' (x86_64) 2022-02-11 23:03:46.521888+0800 test[93509:3739807] TestExample---- 2022-02-11 23:03:46.522154+0800 test[93509:3739807] testApp---- Process 93509 exited with status = 0 (0x00000000)
对比实际项目, 在使用 Cocoapods
时默认为我们生成 xcconfig
文件,就会发现其配置的就是 @executable_path
和 '@loader_path
LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
再对比下这个 demo
可执行文件的 LC_RPATH
❯ otool -l /Users/shenyj/Library/Developer/Xcode/DerivedData/SPMDemo-hbiigpxobympwcdkxpzzqndgzezo/Build/Products/Debug-iphonesimulator/SPMDemo.app/SPMDemo | grep 'RPATH' -A 5
cmd LC_RPATH
cmdsize 32
path /usr/lib/swift (offset 12)
Load command 48
cmd LC_RPATH
cmdsize 40
path @executable_path/Frameworks (offset 12)
Load command 49
cmd LC_RPATH
cmdsize 40
path @loader_path/Frameworks (offset 12)
Load command 50
cmd LC_RPATH
cmdsize 40
path @executable_path/Frameworks (offset 12)
Load command 51
cmd LC_FUNCTION_STARTS
cmdsize 16
探索时我把frameworks文件夹拼在了动态库的rpath上,而cocoapods是设置给了可执行文件