我有一个CMake项目,其中有几个子项目,这些子项目创建了用-flto=thin构建的静态库。
该项目有许多与上述库相关联的测试。使用LTO需要大量时间来构建测试,因此我已经禁用了使用-fno-lto进行测试的LTO。
不过,我注意到的是,lld在测试中执行LTO,即使使用-fno-lto也是如此。如果我使用--time-trace运行链接器,我可以看到大部分时间都花在LTO上。
我的问题是:
lld在它链接的对象中找到LTO信息时就执行LTO。-fno-lto添加到编译器中似乎不起作用,而且lld没有显式禁用LTO.更新1:
这就是我如何在lto中处理CMake:
# Enable Thin LTO only on non-test targets.
if(ENABLE_LTO)
if (IS_TEST)
target_compile_options(${TARGET} PRIVATE -fno-lto)
# Probably pointless.
target_link_options(${TARGET} PRIVATE -fno-lto)
else()
message(STATUS "ENABLE_LTO on target ${TARGET})")
target_compile_options(${TARGET} PRIVATE -flto=thin)
target_link_options(${TARGET} PRIVATE -flto=thin -Wl,--thinlto-cache-dir=${CMAKE_BINARY_DIR}/lto.cache)
endif()
endif()发布于 2022-05-15 15:48:59
如果使用-flto编译库,那么至少对于gcc来说,对象文件将只包含中间语言,而不包含二进制代码。
这意味着当您将它们链接到用-fno编译的测试用例时,没有任何二进制代码可链接到。链接器别无选择,只能首先为每个需要的函数将中间语言编译成二进制,这将被看作是LTO阶段。
在gcc中,有一个选项-ffat对象,它告诉gcc在对象文件中同时包含中间语言和二进制代码。然后,它们可以用于与LTO连接,也可以用于不使用LTO。缺点是这需要更长的时间来编译并生成更大的对象文件。
您必须检查clang是否有相同的选项,它们通常与选项相当兼容。
https://stackoverflow.com/questions/72190379
复制相似问题