美文网首页ios 开发
链接静态库生成可执行文件

链接静态库生成可执行文件

作者: iOS小洁 | 来源:发表于2022-12-19 20:05 被阅读0次

链接静态库.a生成可执行文件

操作文件夹:链接静态库.a文件

在生成test.o文件时,需要有TestExample.h文件

1、将test.m编译成test.o:

  1. 使用OC
  2. 生成的是X86_64_macOS架构的代码
    1. Big Sur是:x86_64-apple-macos11.1,
    2. 之前是:x86_64-apple-macos10.15
  3. 使用ARC
  4. 使用的SDK的路径在:
    1. Big Sur是:/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX11.1.sdk
    2. 之前是:/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk
  5. 用到的其他库的头文件地址在./Frameworks
clang -x objective-c \
-target x86_64-apple-macos11.1 \
-fobjc-arc \
-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk \
-I./StaticLibrary \
-c test.m -o test.o

将TestExample.m 编译成TestExample.o

clang -x objective-c \
-target x86_64-apple-macos11.1 \
-fobjc-arc \
-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk \
-c TestExample.m -o TestExample.o

2、.o文件生成.a静态库

创建库命令,可以创建动态静态库

使用上面生成的TestExample.o 来创建libTestExample.a 静态库

libtool -static -arch_only x86_64 TestExample.o -o libTestExample.a

3、.o文件链接静态库,生成可执行文件

test.o链接libTestExample.a生成test可执行文件

-L./StaticLibrary 在当前目录的子目录StaticLibrary查找需要的库文件

-lTestExample 链接的名称为libTestExample/TestExample的动态库或者静态库

查找规则:先找lib+<library_name>的动态库,找不到,再去找lib+<library_name>的静态库,还找不到,就报错

-syslibroot: 系统库文件的目录

ld \
-syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -lsystem -framework Foundation \
-lTestExample \
-L./StaticLibrary \
test.o -o test

也可以使用clang

clang -target x86_64-apple-macos11.1 \
-fobjc-arc \
-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk \
-L./StaticLibrary \
-lTestExample \
test.o -o test

链接Frameworks静态库

文件夹:静态库与Framework

1、创建.frameworks静态库

执行命令 TestExample.m --> TestExample.o --> TestExample文件

clang -x objective-c \
-target x86_64-apple-macos11.1 \
-fobjc-arc \
-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk \
-c TestExample.m -o TestExample.o

libtool -static -arch_only x86_64 TestExample.o -o TestExample

将TestExample文件和Header文件夹放在一个文件夹内,修改名字为TestExample.framework

2、test.m 生成 test.o

clang -x objective-c  \
-target x86_64-apple-macos11.1 \
-fobjc-arc \
-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk \
-I./Frameworks/TestExample.framework/Headers \
-c test.m -o test.o

3、test.o生成可执行文件

test.o链接TestExample.framework生成test可执行文件

-F./Frameworks 在当前目录的子目录Frameworks查找需要的库文件

-framework TestExample 链接的名称为TestExample.framework的动态库或者静态库

查找规则:先找TestExample.framework的动态库,找不到,再去找TestExample.framework的静态库,还找不到,就报错

clang -target x86_64-apple-macos11.1 \
-fobjc-arc \
-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk \
-F./Frameworks \
-framework TestExample \
test.o -o test

静态库冲突

设置OTHER_LDFLAGS时参数:

  • noall_load:找到对应的符号就不会继续往下走
  • all_load:所有的符号都会被加入。
  • Objc: 所有OC符号都会被加入

只有设置noall_load时以下代码才能正常执行。

同时可以指定force_load,load_hidden:

  • force_load指定冲突时强制链接哪个库
  • load_hidden指定隐藏哪个库
//-I
HEADER_SEARCH_PATHS = $(inherited) "${SRCROOT}/AFNetworking" "${SRCROOT}/AFNetworking2"
//-L
LIBRARY_SEARCH_PATHS = $(inherited) "${SRCROOT}/AFNetworking" "${SRCROOT}/AFNetworking2"
//-l
// 冲突
// all_load
// -ObjC
// 两个静态库 -》 库
// OTHER_LDFLAGS = $(inherited) -l"AFNetworking" -l"AFNetworking2" 
// OTHER_LDFLAGS = $(inherited) -noall_load -l"AFNetworking" -l"AFNetworking2"
// OTHER_LDFLAGS = $(inherited) -all_load -l"AFNetworking" -l"AFNetworking2"
// OTHER_LDFLAGS = $(inherited) -Objc -l"AFNetworking" -l"AFNetworking2" 

OTHER_LDFLAGS = $(inherited) -l"AFNetworking" -l"AFNetworking2" -Xlinker -force_load -Xlinker "${SRCROOT}/AFNetworking/libAFNetworking.a" -Xlinker -load_hidden -Xlinker "${SRCROOT}/AFNetworking/libAFNetworking.a"

相关文章

  • 链接静态库生成可执行文件

    链接静态库.a生成可执行文件 操作文件夹:链接静态库.a文件 在生成test.o文件时,需要有TestExampl...

  • iOS-静态库&动态库-Embed&Sign

    1、静态库&动态库 1.1 库介绍 程序的run流程:编译->链接->生成可执行文件->运行(加载可执行文件&动态...

  • c语言第四讲 动态库、静态库

    静态库和动态库的生成 静态库 静态库就是一些目标文件的集合,一般以.a结尾,使用于生成可执行文件阶段。链接器将库文...

  • APP编译及加载过程

    编译过程 静态库&动态库 一.静态库在链接阶段,会将会将汇编生成的目标文件与引用的库一起链接打包到可执行文件中。二...

  • 静态库和动态库

    静态库 在链接阶段会将汇编生成的目标程序和引用的库一起链接打包到可执行文件中, 此时的静态库就不会再改变了, 以为...

  • Linux链接库

    动态链接库(共享链接库) 杂项 生成.o文件 生成.so 使用动态库 静态链接库 杂项 生成.a 查看.a 使用静态库

  • c语言中动态库的使用(启动时链接和运行时链接)

    背景 c语言中存在静态库(.a)和动态库(.so)。 静态库实际上是一些目标文件的集合,只用于链接生成可执行文件阶...

  • lib 与 dll 的区别

    静态库:在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态库,其特点是可执行文...

  • 静态库和动态库

    1. 静态库 在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。因此对应的链接方式称为...

  • 如何生成以及链接静态库

    这篇文章讲解了如何生成静态库,以及如何与静态库链接。 了解如何生成以及链接静态库,需要对gcc/g++有所了解,这...

网友评论

    本文标题:链接静态库生成可执行文件

    本文链接:https://www.haomeiwen.com/subject/fexuqdtx.html