Lar*_*rry 3 c gcc shared-libraries lto
试图了解lto(链接时间编译)的工作原理
我有这些文件:
julia.h:
#ifndef JULIA_H
#define JULIA_H
#include <stdio.h>
int julian();
#endif // JULIA_H
Run Code Online (Sandbox Code Playgroud)
julia.c:
#include "julia.h"
int julian()
{
printf("Hello Worldu!\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译为共享库如下:gcc -O3 -fPIC -shared julia.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;
}
Run Code Online (Sandbox Code Playgroud)
编译:GCC -O3 main.c中-I /路径/到/ INC -L /路径/到/ lib中-Wl,-rpath = /路径/到/ lib中-ljulia -flto
它编制罚款.
所以,这是一个hello world程序,但我是否正确使用LTO?是否只需要优化连接?
谢谢
oli*_*bre 13
正如keltar所说,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
Run Code Online (Sandbox Code Playgroud)
注:-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
Run Code Online (Sandbox Code Playgroud)
不要忘记,真正的编译将在链接时完成.因此,将优化标志从CFLAGS
(和CXXFLAGS
)移到LDFLAGS
;-)还有一件事,调试信息和LTO在GCC-4.9中仍然是实验性的.GCC-5.0应该改善这一点......
归档时间: |
|
查看次数: |
4097 次 |
最近记录: |