我想让 rustclld
用作链接器,而不是ld
在特定的板条箱中。所以我.cargo/config
在我的项目目录中创建以下内容:
[target.x86_64-unknown-linux-gnu]
linker = "ld.lld"
Run Code Online (Sandbox Code Playgroud)
这会导致链接器错误:
$ cargo build
...
= note: ld.lld: error: unable to find library -ldl
ld.lld: error: unable to find library -lrt
ld.lld: error: unable to find library -lpthread
ld.lld: error: unable to find library -lgcc_s
ld.lld: error: unable to find library -lc
ld.lld: error: unable to find library -lm
ld.lld: error: unable to find library -lrt
ld.lld: error: unable to find library -lpthread
ld.lld: error: unable to find …
Run Code Online (Sandbox Code Playgroud) 目前,LLVM项目中 的链接器lld
开发时每周都会添加新功能.它的开发人员承诺lld
比它快ld
.与之相比,它如何竞争gold
?
lld是替代品ld
吗?随着黄金有一些箍通过跳跃.
国家的人gold
:
-L DIR, --library-path DIR
Add directory to search path
--rpath-link DIR
Add DIR to link time shared library search path
Run Code Online (Sandbox Code Playgroud)
bfd的男人ld
让它有点像-rpath-link
用于递归包含sos 的声音.
ld.lld
甚至没有将其列为参数.
有人可以为我澄清这种情况吗?
尝试在Mac OS Sierra上使用LLVM 4.0.0版本(Clang,LLD)链接一个简单的程序.注意,这在Linux中是完全可以实现的.
我当前的路径以LLVM的bin
目录为前缀(即/opt/LLVM/4.0.0/bin:$PATH
.
program(main.cpp
)是最简单的C++应用程序:
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
发出的shell命令是:clang -fuse-ld=lld
.
这会因以下错误而失败:
/opt/llvm/4/bin/ld.lld: error: unknown argument: -no_deduplicate
/opt/llvm/4/bin/ld.lld: error: unknown argument: -dynamic
/opt/llvm/4/bin/ld.lld: error: unknown argument: -arch
/opt/llvm/4/bin/ld.lld: error: unknown emulation: acosx_version_min
/opt/llvm/4/bin/ld.lld: error: unable to find library -lto_library
/opt/llvm/4/bin/ld.lld: error: /opt/llvm/4/lib/libLTO.dylib: invalid data encoding
clang-4.0: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)
使用-v
开关,我看到这个链接器命令(格式化):
"/opt/llvm/4/bin/ld.lld" \
-demangle \
-lto_library /opt/llvm/4/lib/libLTO.dylib \ …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 CMake 和 clang + lld ( http://releases.llvm.org/ ) + mingw ( https://sourceforge )编译 SDL2 ( https://www.libsdl.org/download-2.0.php ) .net/projects/mingw-w64/ ) 头文件在 Windows 10 上。尽管我做了很多努力,但我似乎无法让 CMake 通过 mingw ld 链接器使用 lld 链接器。
我目前使用批处理文件构建 sdl2:
@ECHO OFF
IF NOT EXIST build MKDIR build
PUSHD build
cmake.exe -DCMAKE_BUILD_TYPE=Debug -G "MinGW Makefiles"^
-DCMAKE_C_FLAGS="-target x86_64-windows-gnu"^
-DCMAKE_C_COMPILER_ID="Clang" -DCMAKE_C_COMPILER="clang.exe"^
-DCMAKE_CXX_FLAGS="-target x86_64-windows-gnu"^
-DCMAKE_CXX_COMPILER_ID="Clang++" -DCMAKE_CXX_COMPILER="clang++.exe"^
-DDIRECTX=OFF -DSDL_TEST=OFF -DSDL_SHARED=OFF -DSDL_STATIC=ON ..
cmake.exe --build . -- -j %NUMBER_OF_PROCESSORS%
POPD
Run Code Online (Sandbox Code Playgroud)
我试过无济于事:
环境 -fuse-ld=lld.exe
环境 LDFLAGS=lld.exe
环境 -DCMAKE_LINKER=lld.exe
解决方案来自:CMake:使用自定义链接器
任何帮助将不胜感激。
我最近发现了 LLVM 的链接器,lld
它因链接速度非常快而受到称赞。事实上,我测试了它,结果非常棒,与gold
.
然而,当谈到链接时优化时,我的知识是有限的。据我通过阅读互联网上的内容了解到,目标文件中产生了一些额外的代码,代表一些内部编译器结构,然后在链接阶段使用。因此,我担心链接时优化(及其好处)是否受到此编译器/链接器组合的影响。我希望对此事有一些解释!
我使用了gcc
版本9.2.0
和lld
版本10.0.0
。
我用来生成目标文件的命令:
/opt/gcc/9.2.0/bin/c++ -fPIE -flto -ffat-lto-objects -fuse-linker-plugin -m64 -O3 -g -DNDEBUG -o my_object.cpp.o -c my_source_file.cpp
Run Code Online (Sandbox Code Playgroud)
对于链接:
#-fuse-ld=gold
/opt/gcc/9.2.0/bin/c++ -fPIE -flto -ffat-lto-objects -fuse-linker-plugin -m64 -pie -fuse-ld=gold -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -static-libstdc++ -static-libgcc -Wl,--threads -Wl,--thread-count,1
#-fuse-ld=lld
/opt/gcc/9.2.0/bin/c++ -fPIE -flto -ffat-lto-objects -fuse-linker-plugin -m64 -pie -fuse-ld=lld -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -static-libstdc++ -static-libgcc -Wl,--threads -Wl,
Run Code Online (Sandbox Code Playgroud) 我在 macOS 10.15 上使用 Clang 10(不是 AppleClang),并尝试通过-fuse-ld=lld
在 CMake flags 中指定来与 LLD 链接CMAKE_EXE_LINKER_FLAGS
。
但是,当我尝试使用 LLD 时,出现以下错误:
The C++ compiler
"/Users/XXX/llvm/bin/clang++"
is not able to compile a simple test program.
It fails with the following output:
ld64.lld: warning: ignoring unknown argument: -platform_version
ld64.lld: warning: ignoring unknown argument: -search_paths_first
ld64.lld: warning: ignoring unknown argument: -headerpad_max_install_names
ld64.lld: warning: -sdk_version is required when emitting min version load command. Setting sdk version to match provided min version
ld64.lld: error: Unable to find …
Run Code Online (Sandbox Code Playgroud) 我有一个 CMake 项目,其中有几个子项目,这些子项目创建使用-flto=thin
.
该项目有很多与上述库相关的测试。使用 LTO 需要花费大量时间来构建测试,因此我已禁用 LTO 进行使用-fno-lto
.
但我注意到,lld
即使使用-fno-lto
. 如果我运行链接器,--time-trace
我可以看到大部分时间都花在了 LTO 上。
我的问题是:
lld
只要在它链接的对象中找到 LTO 信息,就会执行 LTO。-fno-lto
到编译器似乎不起作用,并且lld
没有显式禁用 LTO 的参数。这就是我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()
Run Code Online (Sandbox Code Playgroud) 我已经开始写《Rust 零性能》一书。本文讨论使用 lld 链接器而不是标准 rust 链接器来加快编译时间。然而,这本书现在已经出版了大约一年,它提到正在努力使 lld 尽可能成为 Rust 中的标准链接器。
有谁知道这部作品的进度吗?rust 是否使用 ldd 链接器作为标准,如果不是,则使用它时编译时间仍然存在显着差异。