因此,当使用GCC编译大量源文件时,可以使用-j来使用所有可用内核.但链接器怎么样?是否有类似的选项来加速链接或GCC不支持多线程?在一些较大的项目中,它可能需要一段时间......(......我讨厌等待!)
编辑:感谢您指出-j是make的选项,而不是gcc/g ++.但这不能回答我的问题!我想知道gcc是否可以在链接程序时使用多线程!
告诉CMake使用LLVM链接器llvm-link而不是GNU ld作为链接器的最佳方法是什么?使用时配置项目
CXX=clang++ cmake <args>
Run Code Online (Sandbox Code Playgroud)
默认链接器似乎不受影响,保留usr/bin/ld(在Linux上).
这可能不使用单独的工具链文件吗?
我正在尝试使用 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:使用自定义链接器
任何帮助将不胜感激。
当您用于cc(1)链接程序时,它将调用默认的链接程序命令。例如,您的编译器版本可能已构建为在类似Unix的平台上默认使用/ usr / bin / ld。
有没有一种方法可以指定cc(1)(或c++(1))应使用的另一个链接器命令(例如,/usr/local/bin/ld代替/usr/bin/ld)?我主要对gcc和clang感兴趣。
我不是在寻找涉及单独运行各个编译步骤的方法(例如,预处理,编译,汇编,链接)。
例如,我希望这样的事情可以完成这项工作:
env LD=/usr/local/bin/ld cc foo.c -o foo
Run Code Online (Sandbox Code Playgroud)
但这不适用于gcc或clang。当然,如果您有一个先生成目标文件的生成文件,然后调用$ {LD}进行链接(例如env LD=/usr/local/bin/ld make),它将起作用
更新(有一种可能的动机):可以轻松地使用与默认链接程序不同的链接程序进行测试。例如,很高兴能够做到这一点:
cc --linker=/usr/local/bin/ld foo.c -o foo
Run Code Online (Sandbox Code Playgroud)
相反,您必须生成目标文件,运行cc -v以找出的参数ld,ld并使用这些参数手动运行所需的参数:
cc -c foo.c
cc -v foo.c -o /dev/null
Run Code Online (Sandbox Code Playgroud)
现在查看链接器调用,并手动复制/粘贴替换链接器和临时目标文件。喜欢的东西,你这个替换(从测试在Fedora 23所采取的示例)/usr/libexec/gcc/x86_64-redhat-linux/5.3.1/collect2与/usr/local/bin/ld(虽然它不是完全相同一样collect2):
/usr/local/bin/ld -plugin /usr/libexec/gcc/x86_64-redhat-linux/5.3.1/liblto_plugin.so -plugin-opt=/usr/libexec/gcc/x86_64-redhat-linux/5.3.1/lto-wrapper -plugin-opt=-fresolution=/tmp/jhein/ccM2XKIg.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --build-id --no-add-needed --eh-frame-hdr --hash-style=gnu -m elf_x86_64 …Run Code Online (Sandbox Code Playgroud) 我正在尝试将链接器更改为ld.gold,以便可以更快地构建LLVM和CLANG。我用以下方法更改了环境变量:
export LD=ld.gold
Run Code Online (Sandbox Code Playgroud)
并且我已将ccmake中的CMAKE_LINKER更改为/usr/bin/ld.gold。但是,当我生成文件时,我的链接器被检测为GNU ld。编译过程中的最高运行确认ld正在运行,而不是黄金运行。
当将CMake Link Executable变量编辑为:
cmake -DCMAKE_LINKER=/usr/bin/ld.gold -DCMAKE_CXX_LINK_EXECUTABLE="<CMAKE_LINKER> <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>" -G "Unix Makefiles" ../llvm
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
/usr/bin/ld.gold: -Werror=date-time: unknown option
/usr/bin/ld.gold: use the --help option for usage information
utils/PerfectShuffle/CMakeFiles/llvm-PerfectShuffle.dir/build.make:94: recipe for target 'bin/llvm-PerfectShuffle' failed
make[2]: *** [bin/llvm-PerfectShuffle] Error 1
CMakeFiles/Makefile2:13983: recipe for target 'utils/PerfectShuffle/CMakeFiles/llvm-PerfectShuffle.dir/all' failed
Run Code Online (Sandbox Code Playgroud)
我在Ubuntu 16.04上,但是在Arch Linux上也遇到了同样的问题。
谢谢。
我正在尝试使用 CMake 编写一个裸机程序(我的项目位于https://github.com/oska874/cmake_test)。演示源代码如下:
我的C
void mymain(void)
{
int a=0;
a++;
a++;
}
Run Code Online (Sandbox Code Playgroud)
和链接脚本文件是:
我的.lds
ENTRY(mymain)
SECTIONS
{
. = 0x10000;
.text : { *(.text) }
. = 0x8000000;
.data : { *(.data) }
.bss : { *(.bss) }
}
Run Code Online (Sandbox Code Playgroud)
我可以用下面的命令编译它:
gcc -c my.c
ld -T my.lds -o my my.o
Run Code Online (Sandbox Code Playgroud)
但我不知道如何用 CMake 做同样的事情,因为 cmake 总是使用它自己的 .lds 脚本。
我尝试搜索 google 和 stackoverflow,但所有方法都失败了。
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
Run Code Online (Sandbox Code Playgroud)
我试过 CMakeLists.txt 如下:
PROJECT(FreeRtos)
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
set(CMAKE_EXE_LINKER_FLAGS_DEBUG " -T …Run Code Online (Sandbox Code Playgroud) 我正在为LLVM/Clang编写自定义传递,重新编译往往需要一段时间并使用大量内存.我听说黄金链接器(1)花费的时间更少,(2)使用的内存比标准的ld链接器少.
有没有办法将标志传递到LLVM/Clang构建过程并更改为黄金链接器?根据这个答案,我一直在尝试使用覆盖文件,但我似乎没有取得很大的成功.
我还要注意到我正在使用Clang 3.9编译最新的Clang/LLVM版本(4.0); 如果有必要,我不介意切换回GCC,而是宁愿避免它.
运行cmake生成带有STATIC库的项目后,ninja和mingw32-make都无法在链接时生成目标.对于SHARED库或可执行文件,这个设置工作正常.我试过这个"Ninja"和"MinGW Makefiles"发生器:
忍者输出:
[2/2] Linking CXX static library hello_wsl.lib
FAILED: hello_wsl.lib
cmd.exe /C "cd . && "C:\Program Files\CMake\bin\cmake.exe" -E remove hello_wsl.lib && "" qc hello_wsl.lib CMakeFiles/hello_wsl.dir/lib_hello_world.cpp.obj && cd ."
"""" no se reconoce como un comando interno o externo,
programa o archivo por lotes ejecutable.
ninja: build stopped: subcommand failed.
Run Code Online (Sandbox Code Playgroud)
mingw32-make输出:
Scanning dependencies of target hello_wsl
[ 50%] Building CXX object CMakeFiles/hello_wsl.dir/lib_hello_world.cpp.obj
[100%] Linking CXX static library hello_wsl.lib
Error running link command: El parámetro no es correcto
CMakeFiles\hello_wsl.dir\build.make:93: recipe …Run Code Online (Sandbox Code Playgroud)