问题标签 [lto]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 链接时优化的未定义引用
我正在尝试按照此示例将静态库与可执行文件链接,但在 MinGW-w64 上。
我的 CMakeLists 文件:(请注意,这与该答案中的文件相同)
你好ç:
libhello.c:
配置按预期工作:
但是,当按原样编译时,会生成以下错误:
删除文件中的SET(CMAKE_C_ARCHIVE_FINISH true)
行CMakeLists.txt
并重新编译会导致此“未定义引用”错误:
运行nm libhello.a
显示libhello.c
正在使用 LTO 编译:
这似乎是仅在 MinGW 上的问题,因为代码似乎在之前链接的答案中运行良好(尽管我自己无法测试它)。关于出了什么问题/如何解决它的任何想法?
c++ - 在 Linux 上构建具有链接时间代码生成的静态库的正确方法是什么?
我在徘徊,这是使用 GCC 在 Linux 上编译静态库的正确方法,这样当链接时间优化 (LTO) 应用于可执行文件时,该库是可消耗的并且可能实现最佳性能。
当库仅与-flto
可执行文件一起编译时,无论它是否使用都无法链接到它-flto
。错误是:
对“你好”的未定义引用
hello
库中定义的函数在哪里。
根据对此Stack Overflow 问题的回答,一种可能的解决方案如下:
然后可以将库链接到可执行文件,无论-flto
是否-flto
传递给链接器标志。
但是根据这个Stack Overflow 问题的答案,如果我们希望静态库以这样的方式编译,以便在有和没有 LTO 的情况下都可以使用,那么我们必须使用-ffat-lto-objects
. 如果我们再次将此标志添加到库编译标志中,则库可以链接到可执行文件,无论-flto
是否-flto
传递给链接器标志。
我的问题是:
- 第一个解决方案的确切含义是
gcc-ar
什么? 当库使用
-flto
.2.1 不带
-flto
.- 库仅使用
gcc-ar
. - 库仅使用
-ffat-lto-objects
. - 图书馆同时使用
gcc-ar
和-ffat-lto-objects
2.2 与
-flto
库的 3 个变体相同的可执行文件。- 库仅使用
这是我的测试项目的最小、完整和可验证的示例,它是此Stack Overflow 问题中示例的修改版本。我正在使用 GCC 版本7.2.0
。
CMakeLists.txt
exe/CMakeLists.txt
exe/src/main.c
lib/CMakeLists.txt
lib/src/lib.c
c++ - LTO 导致标准库崩溃
考虑以下程序:
我尝试使用各种标志构建它并以echo foo | ./prog
.
-O0
如果我使用从to优化的 clang 5.0 或 gcc 7.1(或 7.2)构建它-O3
,它会按预期工作。但是,如果我添加-flto
到这些配置中的任何一个,它会立即崩溃并出现以下回溯:
Valgrind 以一种更易读的方式报告了相同的内容:
--std=c++14
即使启用了 LTO,它也可以在以下情况下正常工作。
那么问题是什么?这是两个编译器中 C++17 的 LTO 实现中的错误吗?或者只是libstdc++
用错误的标志编译?我使用 opensuse 42.3 并且标准库是从存储库安装的。
它可以以某种方式解决吗?
clang - 为什么仅当此代码的 LTO 关闭时才会触发地址清理程序?
我有以下代码,地址清理程序仅在 LTO 关闭时捕获违规。-Os 和 -O0 之间的更改不会影响它。任何想法为什么?
gcc - CMake 如何检查 IPO 支持?
我正在尝试使用 CMake 3.10 构建一个带有 IPO 的 C++ 应用程序,我的内容如下CMakeLists.txt
:
我在 CentOS 4 机器上使用配置为启用 IPO(默认)的 GCC 7.2,并且我能够使用该-flto
标志编译一个简单的测试程序。然而 CMake 报告不支持 IPO。在多台其他机器上,支持相同的 CMake 脚本报告 IPO。
如果我知道 CMake 如何检查 IPO 支持,这将有助于我理解问题所在。CMake 的模块是如何CheckIPOSupported
工作的?
c++ - 带有 -flto 和 -std=c++17 的 g++ 7 导致分段错误(因核心转储而中止)
代码:
编译并链接到:
结果是:
* `./a.out' 中的错误:free():无效指针:0x0000000000602200 *中止(核心转储)
-flto
它在没有标志的情况下编译并运行良好。保持-flto
但更改-std=c++17
为-std=c++14
or-std=c++11
也会使其工作。所以似乎 和 的组合有些flto
东西c++17
。
gdb 结果:
编译器和操作系统:g++-7 (Ubuntu 7.2.0-1ubuntu1~14.04) 7.2.0
c++ - gcc LTO:限制优化范围
一个相当大的共享库(许多模板实例化)的 LTO 构建需要相当长的时间(>10 分钟)。现在我知道一些关于库的事情,并且可以以不需要一起分析的目标文件的形式指定某种“黑名单” (因为它们之间没有应该被内联的调用),或者我可以指定应该一起分析的目标文件组。这可能以某种方式(不拆分库)吗?
gcc - gcc 的 -flto 丢弃了什么?
我正在使用 arm-none-eabi-gcc 6.3.1 为 stm32 构建我们的固件。
如果我启用链接时优化,它仍然可以编译和启动,并且比没有 -ftlo 的情况小约 10kiB,但有一些细微的损坏。
我该如何调试呢?
有没有办法让 gcc 告诉我它在链接时优化期间(错误地)丢弃了什么?
c++ - Clang、GCC 和 LTO 之间的互操作性
我知道 Clang 和 GCC 或多或少是兼容的 C/C++ 编译器,只要它负责架构标志、预定义和链接正确的库之类的事情。使用一个编译器创建库并将它们与另一个编译器创建的对象链接实际上非常容易(至少在 x86 上)。
这是一个小测试项目,正是这样做的: https ://gitlab.com/higaski/Interoperability
但是,我想知道链接时间优化(LTO)是否可以跨编译器工作?我知道 LTO 需要某种形式的中间表示,例如 LLVM 位码或 GCC GIMPLE,但也许有一个工作流可以同时使用它们?
sql-server - 备份用于 SQL Server 数据库的 SAN
该方案基本上是存储在 SAN 上的 SQL Server 数据库。我正在尝试为此 SAN 实施备份策略,因为在此 SAN 上将存储项目的数据库。
建议是使用磁带备份,但我不知道它是否可行,或者这种做法是否已过时。我想使用辅助 SAN 作为备份系统,但我一直认为 LTO 磁带是紧急备份系统的主要建议。目标是使其恢复尽可能简单和快速,同时为用作备份的存储解决方案提供最大的可靠性。
这是一个正确的方法吗?什么是实施最多的备份系统,考虑到这将是一个数据仓库项目,它将使用 SSIS 来设计包并且这些备份只会保存数据。
在此先感谢您的任何建议