gcc LTO-共享库-我说的对吗? 背景:

gcc LTO-共享库-我说的对吗? 背景:,c,gcc,shared-libraries,lto,C,Gcc,Shared Libraries,Lto,试图了解lto(链接时间编译)是如何工作的 代码: 我有这些文件: 朱莉娅·h: #ifndef JULIA_H #define JULIA_H #include <stdio.h> int julian(); #endif // JULIA_H 编译为共享库,如下所示: gcc-O3-fPIC-sharedjulia.c-o libjulia.so-L$PWD-I$PWD-flto 我的主要节目是: main.c #include <stdio.h> #includ

试图了解lto(链接时间编译)是如何工作的

代码: 我有这些文件:

朱莉娅·h:

#ifndef JULIA_H
#define JULIA_H
#include <stdio.h>
int julian();

#endif // JULIA_H
编译为共享库,如下所示: gcc-O3-fPIC-sharedjulia.c-o libjulia.so-L$PWD-I$PWD-flto

我的主要节目是:

main.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "julia.h"

int main()
{

    julian();

    return 0;
}
#包括
#包括
#包括
#包括“julia.h”
int main()
{
朱利安();
返回0;
}
汇编时使用: gcc-O3 main.c-I/path/to/inc-L/path/to/lib-Wl,-rpath=/path/to/lib-ljulia-flto

它汇总罚款

问题: 所以,这是一个hello world计划,但我在LTO上做得对吗? 这就是优化连杆机构所需要的全部吗


谢谢

LTO不会影响共享库;动态链接器正在链接它们,动态链接器不知道LTO,无法在运行时修改代码

此外,LTO甚至不能使用静态库,但有一天它可能会使用(gcc wiki上的TODO)

但是是的,需要在编译和链接阶段使用
-flto

如上所述,LTO不会影响共享库。但是

LTO使用静态库 只需将
ar
替换为
gcc ar
,并添加选项
--plugin gccpath/liblto_plugin.so
。这个LTO插件将LTO编译对象中的数据复制到静态库中。(与
ranlib
相同,替换为
gcc ranlib

在你的例子中 注:
-Ofast
在GCC-4.6中引入(否则使用
-03

更新
Makefile

别忘了,真正的编译将在链接时完成。因此,将优化标志从
CFLAGS
(和
cxflags
)移动到
LDFLAGS
;-)还有一件事,调试信息和LTO在GCC-4.9中仍处于实验阶段。GCC-5.0应该改进这一点…

所以基本上,对我来说,它是无用的,对吗?可以对动态库进行哪些优化?如果动态库由多个文件组成,则会影响库本身的编译,因此可能仍有一些好处。编译时间当然会受到严重影响。好的,所以我将使用通常的模式gcc-cfoo.c-foo.o-flto并将其链接到我的主gcc-O3 main.cfoo.o L/blah-Iblah-flto。然后我将受益于所有可能的优化。我希望如此。还有更多的标志,如
-fomit frame pointer
-ffast math
-mtune
-msse
等等,但它们不是通用的或有其他问题,-默认情况下是禁用的。请注意,在编译和链接动态库本身时,可以使用链接时间优化。(当然,如果您的动态库只包含一个文件,那么使用LTO几乎毫无用处)。您可以将LTO与静态库一起使用,请参阅,非常感谢olibre!我会尝试一下!不过我在文档中没有看到这些步骤
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "julia.h"

int main()
{

    julian();

    return 0;
}
# First retrieve the GCC path
gccpath=$(gcc -print-search-dirs | awk '/install/{print $2}')

# Compile the static library
gcc julia.c -o julia.o -flto -ffat-lto-objects
gcc-ar rcs libjulia.a julia.o --plugin $gccpath/liblto_plugin.so

# Compile & link the executable
gcc main.c libjulia.a -flto -Ofast -march=native
GCCPATH = $(shell gcc -print-search-dirs | awk '/install/{print $$2}')
AR      = gcc-ar
RANLIB  = gcc-ranlib
ARFLAGS     += --plugin $(GCCPATH)/liblto_plugin.so
RANLIBFLAGS += --plugin $(GCCPATH)/liblto_plugin.so
CFLAGS      += -flto -ffat-lto-objects
CXXFLAGS    += -flto -ffat-lto-objects
LDFLAGS     += -flto=8    # 8 -> compiles using 8 threads