我启用时GCC会收集哪些信息-fprofile-generate,哪些优化确实使用了收集的信息(设置-fprofile-use标志时)?
我需要引用这里.我已经搜索了一段时间,但没有找到任何记录.
有关链接时间优化(LTO)的信息将是一个加号!= d
我正在尝试使用-fltoGCC(6.1.1)标志的链接时优化.
虽然它正常工作与我的代码,它不使用静态链接库,我也建,并与我的项目链接(该链接引擎和库是GLSL的优化,仅供参考).
这是输出:
...
/usr/bin/ranlib: ir_expression_flattening.cpp.o: plugin needed to handle lto object
/usr/bin/ranlib: opt_function_inlining.cpp.o: plugin needed to handle lto object
/usr/bin/ranlib: opt_copy_propagation_elements.cpp.o: plugin needed to handle lto object
...
Run Code Online (Sandbox Code Playgroud)
在那之后,当然,我得到一些函数的几个"未定义的引用".
我做了一些研究,发现它可能是因为ar我应该尝试使用gcc-ar,但我不确定我该怎么做.
另外,我正在使用不支持lto的CMake(除了某些平台上的intel编译器,所以我读了......).尽管如此,我尝试使用:
set_property(TARGET glsl_optimizer PROPERTY INTERPROCEDURAL_OPTIMIZATION True)
Run Code Online (Sandbox Code Playgroud)
哪个没用.
此外,我尝试了GCC的-fuse-linker-plugin旗帜,但没有奏效.
我想我将不得不手动使用旧的方式直接使用gcc-ar,或者可能还有其他一些方法?
我有最新的cmake构建并尝试所有构建配置(Debug,MinSizeRel,RelWithDebugInfo,Release,General)我在生成的makefile中看不到(文本搜索)字符串-lto,所以或者功能仍然不存在,或者它需要手动转换(在这种情况下,文档搜索LTO或链接时间优化)文档没有结果,所以我在官方文档中看不到启用LTO的方法.
是否有任何方法可以"全局"(对于所有编译器)启用LTO,而无需指定仅由GCC支持的手动标志?
当我尝试使用构建静态库时-flto,我得到未定义的引用错误:
library.cpp:
#include <iostream>
void foo() {
std::cout << "Test!" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
main.cpp:
void foo();
int main() {
foo();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译输出:
$ g++ -flto -c library.cpp
$ ar rcs library.a library.o
$ g++ -flto main.cpp library.a
/tmp/ccZIgxCY.ltrans0.ltrans.o: In function `main':
ccZIgxCY.ltrans0.o:(.text+0x5): undefined reference to `foo()'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
如果我链接library.o而不是,它工作正常library.a.我错过了什么?这与GCC 4.9.1和binutils 2.24有关.
我是铿锵的新手,所以我可能会做些傻事.但我花了几个小时寻找解决方案,包括在这里搜索,我没有找到问题解决-flto与发行版提供的软件包.这个描述的细节是特定于Fedora 18的,但我在Ubuntu 13.04上遇到了类似的问题,所以这个问题并不是特定于Fedora.这是我或铿锵.
问题:我正在尝试编译一个简单的hello-world程序,clang++ -flto以获得链接时优化的好处.没有-flto它工作正常.使用-flto无法链接.调用clang -flto -o hello hello.o -v以查看完整的链接器命令行,我得到:
$ clang++ -flto -o hello hello.o -v
clang version 3.2 (tags/RELEASE_32/final)
Target: x86_64-redhat-linux-gnu
Thread model: posix
"/usr/bin/ld" --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o hello /usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.7.2/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.7.2 -L/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../.. -L/lib -L/usr/lib -plugin /usr/bin/../lib/LLVMgold.so hello.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-redhat-linux/4.7.2/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.7.2/../../../../lib64/crtn.o
/usr/bin/ld: /usr/bin/../lib/LLVMgold.so: error loading plugin
/usr/bin/ld: /usr/bin/../lib/LLVMgold.so: error in plugin cleanup (ignored)
clang: error: linker command failed with exit code …Run Code Online (Sandbox Code Playgroud) 我完成了一个带有以下依赖项的小型Rust项目(大约300行代码):
在cargo build --release没有进一步配置的情况下使用时,会生成2.942.744字节(= 2,8 MiB)的二进制数.我尝试通过启用链接时间优化(LTO)来优化这一点Cargo.toml:
[profile.release]
lto = true
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,二进制文件增长了,新的大小为3.848.288字节(= 3,7 MiB).
怎么解释这个?我配置Cargo有什么错吗?
我正在使用buildroot为嵌入式系统准备图像.我想导出buildroots内部交叉编译器,以便其他人可以使用相同的版本,命令检查GCC版本后:arm-linux-gcc -v我看到配置COLLECT_LTO_WRAPPER为我的硬盘上的静态位置
COLLECT_LTO_WRAPPER=/home/user/arm/buildroot/output/host/usr/libexec/gcc/arm-unknown-linux-uclibcgnueabi/4.7.1/lto-wrapper
Run Code Online (Sandbox Code Playgroud)
它在另一个系统上是不正确的.
我只能发现LTO意味着链路时间优化.你能解释一下lto包装用什么时候需要什么?
我正在尝试在CMake项目上应用链接时间优化和LLVM,这将创建一个共享库.我的问题几乎和这个问题一样:
但是,答案似乎不再适用,因为llvm-ld新版本中不存在.在命令行上,我运行以下命令来获取LTO(假设只有2个.cpp文件):
编译为字节代码:
clang++ -c FirstClass.cpp -O3 -flto -o FirstClass.bc
clang++ -c SecondClass.cpp -O3 -flto -o SecondClass.bc
Run Code Online (Sandbox Code Playgroud)
链接字节码:
llvm-link FirstClass.bc SecondClass.bc -o unoptimized.bc
Run Code Online (Sandbox Code Playgroud)
优化字节码:
opt -O3 unoptimized.bc -o optimized.bc
Run Code Online (Sandbox Code Playgroud)
将字节代码转换为共享对象:
clang++ -shared optimized.bc -o libTest.so
Run Code Online (Sandbox Code Playgroud)
有人可以告诉我如何让CMake运行其他步骤吗?
我有一个项目,在ARM Cortex-M4处理器上运行,我正在尝试包含gcc链接时优化(LTO)功能.
目前我的编译和链接标志是:
CFLAGS = -ggdb -ffunction-sections -Og
LDFLAGS = -Wl,-gc-sections
Run Code Online (Sandbox Code Playgroud)
使用这些标志一切正常,我能够正确调试项目.
然后我尝试添加-flto到CFLAGS.虽然程序工作正常,但我无法再调试项目,gdb抱怨缺少调试符号.objdump -g在ELF文件上运行(启用LTO)会提供以下输出:
xxx.elf: file format elf32-littlearm
Contents of the .debug_frame section:
00000000 0000000c ffffffff CIE
Version: 1
Augmentation: ""
Code alignment factor: 2
Data alignment factor: -4
Return address column: 14
DW_CFA_def_cfa: r13 ofs 0
00000010 00000018 00000000 FDE cie=00000000 pc=08002a3c..08002a88
DW_CFA_advance_loc: 2 to 08002a3e
DW_CFA_def_cfa_offset: 16
DW_CFA_offset: r4 at cfa-16
DW_CFA_offset: r5 at cfa-12
DW_CFA_offset: r6 at cfa-8
DW_CFA_offset: r14 at cfa-4
DW_CFA_nop …Run Code Online (Sandbox Code Playgroud) 当我尝试使用64位mingw(x86_64-5.1.0-posix-seh-rt_v4-rev0)编译我的项目时,我收到了消息:
BFD: my/project/dir/filename.cpp.obj: plugin needed to handle lto object
Run Code Online (Sandbox Code Playgroud)
对于每个源文件.然而,当我使用32位mingw(i686-5.1.0-posix-dwarf-rt_v4-rev0)进行编译时,一切正常.
我的旗帜是:
CXX_FLAGS "-fno-exceptions -fno-rtti -std=c++14 -O3 -fstrict-aliasing -flto -fomit-frame-pointer -march=native -ffast-math -funroll-loops"
LINKER_FLAGS "-O1 -s"
Run Code Online (Sandbox Code Playgroud)
我试图添加-fuse-linker-plugin和-fno-use-linker-plugin,但它没有帮助.我的操作系统是64位Windows 10.如果重要的话,我会使用CLion和CMake,尽管它不应该.我该如何解决?