Upgrade to Pro — share decks privately, control downloads, hide ads and more …

從 Library 到 Framewrok

Avatar for Yume Yume
October 17, 2025
12

從 Library 到 Framewrok

Avatar for Yume

Yume

October 17, 2025

Transcript

  1. 3

  2. main.i(Preprocesser) gcc -E main.c -o main.i # 1 "main.c" #

    1 "<built-in>" 1 # 1 "<built-in>" 3 # 466 "<built-in>" 3 # 1 "<command line>" 1 # 1 "<built-in>" 2 # 1 "main.c" 2 # 1 "./add.h" 1 int add(int a, int b); // ... int main() { printf("%d", add(1, 2)); return 0; } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 5
  3. main.s(Compiler) gcc -S main.i -o main.s _main: ; @main ;

    ... mov w0, #1 ; =0x1 mov w1, #2 ; =0x2 bl _add 1 2 3 4 5 6
  4. hexdump hexdump main 0000000 facf feed 000c 0100 0000 0000

    0002 0000 0000010 0011 0000 0420 0000 0085 0020 0000 0000 ... 10
  5. xxd xxd main 00000000: cffa edfe 0c00 0001 0000 0000

    0200 0000 .......... 00000010: 1100 0000 2004 0000 8500 2000 0000 0000 .... ..... 00000020: 1900 0000 4800 0000 5f5f 5041 4745 5a45 ....H...__ ... 11
  6. objdump objdump -d main 0000000100000460 <_main>: ... 100000478: 52800020 mov

    w0, #0x1 ; =1 10000047c: 52800041 mov w1, #0x2 ; =2 100000480: 9400000b bl 0x1000004ac <_add> 12
  7. Compile & Archive gcc -c add1.c -o add1.o gcc -c

    add2.c -o add2.o ar rcs libadd.a add1.o add2.o 14
  8. How import lib -L . 如果要找 library,可以在這個目錄下尋 找 -ladd 約定成俗,指的是

    libadd.xxx tree . ├── main.c └── libadd.a gcc main.c -L. -ladd -o main 16
  9. Compile Dynamic Library gcc -c -fPIC add_v1.c -o add_v1.o gcc

    -dynamiclib \ -install_name @rpath/libadd.dylib \ -compatibility_version 1.0.0 \ -current_version 1.0.1 \ -o libadd.1.0.1.dylib add_v1.o ln -s libadd.1.0.1.dylib libadd.dylib 18
  10. How import lib tree . ├── main.c └── libadd.dylib gcc

    main.c -L. -ladd -rpath @executable_path -o main 20
  11. List dependency library otool -L main main: @rpath/libadd.dylib (compatibility version

    1.0.0, cur /usr/lib/libSystem.B.dylib (compatibility version 1.0 21
  12. Miss library tree . ├── main.c └── main ./main dyld[54511]:

    Library not loaded: @rpath libadd.dylib Referenced from: 1CE279C9 B4A2 385F 8FC4 8148B5229C66 .../dynamic main Reason: tried: .../dynamic libadd.dylib' (no such file), .../dynamic libadd.dylib' (no such file) zsh: abort ./main / < - - - - > / / / / / / 22
  13. pkg-config # add.pc Name: Add Description: The Add library Version:

    1.0.0 Cflags: -I headers Libs: -L libs -ladd 24
  14. Module Declaration Name.framework/ Modules/module.modulemap Module map for the framework Headers/

    Subdirectory containing framework PrivateHeaders/ Subdirectory containing framework Frameworks/ Subdirectory containing embedded Resources/ Subdirectory containing additiona Name Symbolic link to the shared libra 26
  15. 實際 framework 結構 tree Add.framework Add.framework ├── Add -> Versions/Current/Add

    ├── Headers -> Versions/Current/Headers ├── Modules -> Versions/Current/Modules └── Versions ├── A │ ├── Add │ ├── Headers │ │ └── Add-Swift.h │ └── Modules │ ├── Add.swiftmodule │ └── module.modulemap └── Current -> A 27
  16. Other topic(Mac) Format Mach-O Universal binary FAT header dSYM modulemap

    XCFramework weak framework mergeable framework 35