gcc LTO - 共享库 - 我是对的吗?

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不会影响共享库.但...

LTO适用于静态库

只需更换argcc-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应该改善这一点......