- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在尝试在 g++ 中启用链接时间优化。我的程序在没有 -flto
选项的情况下编译得很好。当我将它添加到我的 Makefile 时,目标文件编译时不会出现错误,例如
g++ main.cpp -I ../includes -std=c++0x -fopenmp -Wall -pedantic -Wno-vla -flto -D INFO_ -c -o .obj/main.o
但是当涉及到链接程序时:
g++ -fwhole-program -I ../includes -std=c++0x -fopenmp -Wall -pedantic -Wno-vla -flto -D INFO_ .obj/main.o .obj/atom.o .obj/bee.o .obj/colony.o ../includes/.obj/error.o ../includes/.obj/CmdLine.o ../includes/boost_lib_deb/libboost_program_options.a ../includes/gmp_lib_deb/lib/libgmpxx.a ../includes/gmp_lib_deb/lib/libgmp.a -o BeeBench
我收到很多这样的错误:
includes/gmp_lib_deb/lib/libgmpxx.a ../includes/gmp_lib_deb/lib/libgmp.a -o BeeBench
`typeinfo for boost::program_options::too_many_positional_options_error' referenced in section `.rodata._ZTVN5boost15program_options33too_many_positional_options_errorE[vtable for boost::program_options::too_many_positional_options_error]' of ../includes/boost_lib_deb/libboost_program_options.a(cmdline.o): defined in discarded section `.gnu.linkonce.t._ZTIN5boost15program_options33too_many_positional_options_errorE' of .obj/main.o (symbol from plugin)
`typeinfo for boost::program_options::too_many_positional_options_error' referenced in section `.rodata._ZTIN5boost16exception_detail19error_info_injectorINS_15program_options33too_many_positional_options_errorEEE[typeinfo for boost::exception_detail::error_info_injector<boost::program_options::too_many_positional_options_error>]' of ../includes/boost_lib_deb/libboost_program_options.a(cmdline.o): defined in discarded section `.gnu.linkonce.t._ZTIN5boost15program_options33too_many_positional_options_errorE' of .obj/main.o (symbol from plugin)
`typeinfo for boost::program_options::invalid_command_line_style' referenced in section `.rodata._ZTVN5boost15program_options26invalid_command_line_styleE[vtable for boost::program_options::invalid_command_line_style]' of ../includes/boost_lib_deb/libboost_program_options.a(cmdline.o): defined in discarded section `.gnu.linkonce.t._ZTIN5boost15program_options26invalid_command_line_styleE' of .obj/main.o (symbol from plugin)
我不知道出了什么问题。我使用 -flto
编译所有目标文件。这些库,即 Boost 和 GMP,在编译时没有 -flto
选项。这是导致错误吗? gcc 手册说可以混合使用 & 不带 -flto
选项编译的目标文件。还是我错过了其他东西,例如错误所说的这个插件是什么?
我在 Debian Wheezy 上使用 G++ 4.6.3。
更新:
按照评论中的建议,我做了一个最小的例子。我的测试程序的代码只有这样:
#include "boost/program_options.hpp"
int main ( int argC, char* argV[] )
{
return 0;
}
当我编译它时:
g++ -o test -I ../includes -Wall -std=c++0x test.cpp -flto -fwhole-program -static
它给出了与上述类似的错误。如果我省略 -static、-flto 或 std=c++0x 选项,它编译时不会出错。 -fwhole-program 选项不会改变结果。我现在也用 G++ 4.7 测试过,同样的错误。
有什么建议吗?这真的是编译器错误,还是我仍然做错了什么?
最佳答案
由于我没有发现任何证据表明我的代码有问题,因此我发布了 Boost bugreport .它也被其他 boost 用户复制,因此我认为它实际上是 boost 或 g++ 中的一个错误。到目前为止,Boost 维护者没有任何回应。有的话我会更新这篇文章的。
更新
似乎是 g++ 链接器插件导致了问题(我仍然不知道为什么)。因此,一种可能的解决方法是使用 -fno-use-linker-plugin
禁用链接器插件。
关于c++ - 使用 -flto 选项的 g++ 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10050140/
我最近的一个程序高度依赖于内联一些“热门”函数来提高性能。这些热门函数是我不想更改的外部 .c 文件的一部分。 不幸的是,虽然 Visual 非常擅长此练习,但 gcc 和 clang 却不是。显然,
我使用的是 GCC 4.7.2 和 LD 2.23,但是当我将 -flto 添加到我的编译选项时,我的编译时间增加了 20% 以上!该手册似乎表明优化工作需要 -fuse-linker-plugin。
如果我想用 -flto 编译我的项目用 --enable-gold 构建 gcc 就够了吗?或者我还需要建立黄金并用它替换 ld 吗?我还需要其他标志吗?即我正在做这个 gcc -flto one.c
我有一大段代码,仅在某些版本的 gcc 上使用 -flto 编译时会产生错误。我将尝试总结如下 在文件 1.h 中 extern char A [100]; 在文件 1.c 中 #include "f
我试图将大量代码塞进一个相当小的 ARM 微 Controller 中。我已经在大小优化方面做了大量工作,而且我已经到了需要双重算术的地步,但是 __aeabi_ddiv , __aeabi_dadd
我的问题很简单,关键字 inline 对链接时间优化的看法有影响吗?对于链接时间优化,我指的是支持 -flto(链接时间优化)的 GCC 版本。 例如: main.c #include "b.h"
我在以下代码文件中遇到 getline 崩溃。我构建了 gcc7.2,因为系统更新不可用。 最小的例子: #include int main(int argc, char *argv[]) {
我正在尝试在 g++ 中启用链接时间优化。我的程序在没有 -flto 选项的情况下编译得很好。当我将它添加到我的 Makefile 时,目标文件编译时不会出现错误,例如 g++ main.cpp -I
我正在尝试使用 llvm-lld 链接已使用 -flto 编译的对象。 我在路径调用 lld 中有 ld 以及提供的所有参数。我创建了一个简单的 C++ 程序,我用 clang++ 编译它: #inc
我正在使用具有 AVR Atmega2560 芯片的 Arduino Mega 2560。我正在使用 Windows 上的 Arduino IDE 1.8.4 对其进行编程,它附带 avr-objdu
我知道较新的 GCC 版本引入了可能错误的字符串操作“stringop-truncation”的警告 这是我可以轻松触发此警告的示例代码: $ cat strncpy-warning.cxx #inc
我正在使用 SystemWorkbench 4 stm32 对 STM32F413 微 Controller 进行编程。中断 vector 在程序集启动文件中定义为弱别名,如下所示: .weak
我观察到带有 GCC 标志 -flto 的意外行为(至少我找不到解释)和 jemalloc/tcmalloc .一次-flto被使用并且我链接到上面的库 malloc/calloc 并且 friend
我正在使用 flto 构建应用程序,我想在 make 中使用的所有内核上并行化它,例如,如果我使用 make -j4 然后在 4 个内核上运行它 例子: cmake_minimum_required(
我是一名优秀的程序员,十分优秀!