正如keltar所说,LTO不会影响共享库.但...
LTO适用于静态库只需更换ar
的gcc-ar
,并添加选项--plugin gccpath/liblto_plugin.so
.这LTO插件将在复制声明,类型,调用图和GIMPLE表示从LTO- 编译对象为静态库.(同样ranlib
被替换gcc-ranlib
)
# 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
注:-Ofast
引入GCC-4.6 [参考](否则使用-03
)
Makefile
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
不要忘记,真正的编译将在链接时完成.因此,将优化标志从CFLAGS
(和CXXFLAGS
)移到LDFLAGS
;-)还有一件事,调试信息和LTO在GCC-4.9中仍然是实验性的.GCC-5.0应该改善这一点......