Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 包括带有-all_load标志的静态库_Macos_Gcc_Compiler Construction_G++_Clang - Fatal编程技术网

Macos 包括带有-all_load标志的静态库

Macos 包括带有-all_load标志的静态库,macos,gcc,compiler-construction,g++,clang,Macos,Gcc,Compiler Construction,G++,Clang,在什么情况下,您需要-all_load标志 假设我有 g++ source.cpp -o test libA.a libB.a libC.a 据我回忆,是否存在对source.cpp中使用的符号的引用 在saylibB.a文件中,将链接libB.a(仅该符号或该库中的整个代码?),并且libA.a和libC.a将被忽略(它们的代码将不会出现在最终可执行文件中) 当我使用-all_load标志时,其他库会发生什么情况,如下所示 g++source.cpp-o test-Wl,-all_加载li

在什么情况下,您需要-all_load标志

假设我有

g++ source.cpp -o test libA.a libB.a libC.a
据我回忆,是否存在对source.cpp中使用的符号的引用 在say
libB.a
文件中,将链接
libB.a
(仅该符号或该库中的整个代码?),并且
libA.a
libC.a
将被忽略(它们的代码将不会出现在最终可执行文件中)

  • 当我使用-all_load标志时,其他库会发生什么情况,如下所示

    g++source.cpp-o test-Wl,-all_加载libA.a libB.a libC.a

  • “strip”命令如何影响带有all_load标志的输出


-当您想要链接(链接器)不需要的编译单元时,所有加载都是适用的。例如,您可能会在运行时动态访问静态库中的函数,您知道这些函数的地址,但实际上尚未对其进行任何显式函数调用。你会怎么做?好的,编译器可以帮助您在可执行文件中存储一堆函数指针,以便在运行时读取,然后您可以构建一个查找系统,使用字符串查找这些函数,然后您可以调用整个Objective-C,它可能是
-all\u load
的最常见用户(至少如果Google是指南的话)

在ObjC中,最常见的情况是在自己的编译单元中有一个类别。编译器可能无法判断您引用了它,因此不会链接它。因此,ObjC程序员比其他类似C的程序员更经常地使用
-all_-load
(或
-force_-load
)。事实上,
-all_load
是gcc中特定于达尔文的扩展

但在某些情况下,人们可能希望在ObjC之外使用
-all\u load
。例如,libA和libB中可能存在一些相互依赖关系。考虑这种情况:

  • source.cpp需要
    A()
    B()

  • libA在
    A.o中定义
    A()
    ,在
    Aprime.o中定义
    Aprime()

  • libB在
    B.o
    中定义
    B()
    ,需要
    Aprime()

这通常不会链接(*)。编译器将从
source.o
开始,并列出要求:
a()
B()
。然后,它将查看libA,并看到它定义了
A()
,因此它将链接
A.o
(而不是
aprime.o
)。然后查看libB,它定义了
B()
并需要
Aprime()
。它现在已出库,并且尚未解析
Aprime()
。它失败了

(*)实际上,它将与clang一起使用,因为clang在这方面非常聪明。但至少在4.6版本之前,g++是不可能实现的

最好的解决方案是对其重新排序,使libB排在第一位(**)。但是如果依赖关系是循环的,您可能会完全陷入困境
-all_load
-force_load
允许您通过关闭链接器的优化来解决这些情况

(**)真正最好的解决方案通常是重新设计库以避免这种相互依赖,但这可能希望太多了

如果要处理此问题,请参阅


strip
只是从可执行文件中删除符号。这与静态链接和
-all_load
(尽管它确实会影响动态链接)没有特别的关系。对此有很多讨论。

-force\u load
在较新版本的
clang
中不起作用。。据我所知。。。