@executable_path - ShenYj/ShenYj.github.io GitHub Wiki

@executable_path

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是设置给了可执行文件

⚠️ **GitHub.com Fallback** ⚠️