gcc LTO-共享库-我说的对吗? 背景:
试图了解lto(链接时间编译)是如何工作的 代码: 我有这些文件: 朱莉娅·h: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
#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