【C++随记】collect2: error: ld returned 1 exit status错误分析与解决

2024-06-17 1283阅读

目录

1、问题背景

2、解决方法

2.1 深入编译过程

1)查看error发生点

2)复现error

2.2 缩小case

2.3 确定问题

2.4 静态编译和动态编译的效果

参考文献:


1、问题背景

        在项目工程代码编译过程中,出现以下报警

/usr/bin/ld: cannot find -lstdc++
collect2: error: ld returned 1 exit status
make[2]: *** [runtime/CMakeFiles/testrt_shared.dir/build.make:209: runtime/libtestrt_shared.so] Error 1
make[1]: *** [CMakeFiles/Makefile2:1611: runtime/CMakeFiles/testrt_shared.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....

2、解决方法

2.1 深入编译过程

1)查看error发生点

通过以上log,进入过程文件路径 build.make下,发现有生成一个link.txt的log日志。ld的错误,就是链接过程中出现了错误。

打开link.txt,里面内容如下

/usr/bin/c++ -fPIC  -std=c++11 -fPIC -fvisibility=hidden -Wall -pthread -fno-strict-aliasing -ftemplate-depth=2014 -O3 -DNDEBUG -static-libgcc -static-libstdc++ -Wl,--version-script=/home/admin1/guan/s2_runtime_20240511/s2_runtime/runtime/version-script-testrt.map -shared -Wl,-soname,libtestrt_shared.so -o libtestrt_shared.so CMakeFiles/testrt_shared.dir/test_rt/ta.cpp.o CMakeFiles/testrt_shared.dir/test_rt/fatbin_registry.cpp.o CMakeFiles/testrt_shared.dir/test_error.cpp.o CMakeFiles/testrt_shared.dir/test_runtime.cpp.o CMakeFiles/testrt_shared.dir/test_command.cpp.o CMakeFiles/testrt_shared.dir/test_compiler_api.cpp.o CMakeFiles/testrt_shared.dir/test_internal.cpp.o CMakeFiles/testrt_shared.dir/fp16.c.o  -ldl

2)复现error

在build路径下,重新执行link.txt中的指令。发现可以复现现象。在复现的指令后面,增加参数 -v,可以得到更具体的过程log。

/usr/bin/c++ -fPIC  -std=c++11 -fPIC -fvisibility=hidden -Wall -pthread -fno-strict-aliasing -ftemplate-depth=2014 -g -static-libgcc -static-libstdc++ -Wl,--version-script=/home/admin1/guan/s2_runtime_20240511/s2_runtime/runtime/version-script-testrt.map -shared -Wl,-soname,libtestrt_sharedd.so -o libtestrt_sharedd.so CMakeFiles/testrt_shared.dir/test_rt/ta.cpp.o CMakeFiles/testrt_shared.dir/test_rt/fatbin_registry.cpp.o CMakeFiles/testrt_shared.dir/test_error.cpp.o CMakeFiles/testrt_shared.dir/test_runtime.cpp.o CMakeFiles/testrt_shared.dir/test_command.cpp.o CMakeFiles/testrt_shared.dir/test_compiler_api.cpp.o CMakeFiles/testrt_shared.dir/test_internal.cpp.o CMakeFiles/testrt_shared.dir/fp16.c.o  -ldl -v

Using built-in specs.

COLLECT_GCC=/usr/bin/c++

COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/11/lto-wrapper

OFFLOAD_TARGET_NAMES=nvptx-none

OFFLOAD_TARGET_DEFAULT=1

Target: x86_64-redhat-linux

Configured with: ../configure --enable-bootstrap --enable-host-pie --enable-host-bind-now --enable-languages=c,c++,fortran,lto --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.rockylinux.org/ --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-gcc-major-version-only --enable-plugin --enable-initfini-array --without-isl --enable-multilib --with-linker-hash-style=gnu --enable-offload-targets=nvptx-none --without-cuda-driver --enable-gnu-indirect-function --enable-cet --with-tune=generic --with-arch_64=x86-64-v2 --with-arch_32=x86-64 --build=x86_64-redhat-linux --with-build-config=bootstrap-lto --enable-link-serialization=1

Thread model: posix

Supported LTO compression algorithms: zlib zstd

gcc version 11.4.1 20231218 (Red Hat 11.4.1-3) (GCC)

COMPILER_PATH=/usr/libexec/gcc/x86_64-redhat-linux/11/:/usr/libexec/gcc/x86_64-redhat-linux/11/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/11/:/usr/lib/gcc/x86_64-redhat-linux/

LIBRARY_PATH=/usr/lib/gcc/x86_64-redhat-linux/11/:/usr/lib/gcc/x86_64-redhat-linux/11/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-redhat-linux/11/../../../:/lib/:/usr/lib/

COLLECT_GCC_OPTIONS='-std=c++11' '-fPIC' '-fvisibility=hidden' '-Wall' '-pthread' '-fno-strict-aliasing' '-ftemplate-depth=2014' '-g' '-static-libgcc' '-shared' '-o' 'libtestrt_sharedd.so' '-v' '-mtune=generic' '-march=x86-64-v2' '-dumpdir' 'libtestrt_sharedd.so.'
 /usr/libexec/gcc/x86_64-redhat-linux/11/collect2 -plugin /usr/libexec/gcc/x86_64-redhat-linux/11/liblto_plugin.so -plugin-opt=/usr/libexec/gcc/x86_64-redhat-linux/11/lto-wrapper -plugin-opt=-fresolution=/tmp/ccDybwv6.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_eh -plugin-opt=-pass-through=-lpthread -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_eh --build-id --no-add-needed --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -shared -o libtestrt_sharedd.so /usr/lib/gcc/x86_64-redhat-linux/11/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/11/crtbeginS.o -L/usr/lib/gcc/x86_64-redhat-linux/11 -L/usr/lib/gcc/x86_64-redhat-linux/11/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/11/../../.. --version-script=/home/admin1/guan/s2_runtime_20240511/s2_runtime/runtime/version-script-testrt.map -soname libtestrt_sharedd.so CMakeFiles/testrt_shared.dir/test_rt/ta.cpp.o CMakeFiles/testrt_shared.dir/test_rt/fatbin_registry.cpp.o CMakeFiles/testrt_shared.dir/test_error.cpp.o CMakeFiles/testrt_shared.dir/test_runtime.cpp.o CMakeFiles/testrt_shared.dir/test_command.cpp.o CMakeFiles/testrt_shared.dir/test_compiler_api.cpp.o CMakeFiles/testrt_shared.dir/test_internal.cpp.o CMakeFiles/testrt_shared.dir/fp16.c.o -ldl -Bstatic -lstdc++ -Bdynamic -lm -lgcc -lgcc_eh -lpthread -lc -lgcc -lgcc_eh /usr/lib/gcc/x86_64-redhat-linux/11/crtendS.o /usr/lib/gcc/x86_64-redhat-linux/11/../../../../lib64/crtn.o

/usr/bin/ld: cannot find -lstdc++

collect2: error: ld returned 1 exit status

然后再单独执行collect2这条红色的语句,可以复现。并且发现,报错点事 找不到stdc++库。

针对collect2指令,增加-debug参数,以获取更多的log。

/usr/libexec/gcc/x86_64-redhat-linux/11/collect2 -plugin /usr/libexec/gcc/x86_64-redhat-linux/11/liblto_plugin.so -plugin-opt=/usr/libexec/gcc/x86_64-redhat-linux/11/lto-wrapper -plugin-opt=-fresolution=/tmp/ccINdTEJ.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_eh -plugin-opt=-pass-through=-lpthread -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_eh --build-id --no-add-needed --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -shared -o libtestrt_sharedd.so /usr/lib/gcc/x86_64-redhat-linux/11/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/11/crtbeginS.o -L/usr/lib/gcc/x86_64-redhat-linux/11 -L/usr/lib/gcc/x86_64-redhat-linux/11/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/11/../../.. --version-script=/home/admin1/guan/s2_runtime_20240511/s2_runtime/runtime/version-script-testrt.map -soname libtestrt_sharedd.so CMakeFiles/testrt_shared.dir/test_rt/ta.cpp.o CMakeFiles/testrt_shared.dir/test_rt/fatbin_registry.cpp.o CMakeFiles/testrt_shared.dir/test_error.cpp.o CMakeFiles/testrt_shared.dir/test_runtime.cpp.o CMakeFiles/testrt_shared.dir/test_command.cpp.o CMakeFiles/testrt_shared.dir/test_compiler_api.cpp.o CMakeFiles/testrt_shared.dir/test_internal.cpp.o CMakeFiles/testrt_shared.dir/fp16.c.o -ldl -Bstatic -lstdc++ -Bdynamic -lm -lgcc -lgcc_eh -lpthread -lc -lgcc -lgcc_eh /usr/lib/gcc/x86_64-redhat-linux/11/crtendS.o /usr/lib/gcc/x86_64-redhat-linux/11/../../../../lib64/crtn.o -debug

Convert string '/home/admin1/.local/bin:/home/admin1/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin' into prefixes, separator = ':'
  - add prefix: /home/admin1/.local/bin/

  - add prefix: /home/admin1/bin/

  - add prefix: /usr/local/bin/

  - add prefix: /usr/bin/

  - add prefix: /usr/local/sbin/

  - add prefix: /usr/sbin/

Looking for 'real-ld'

  - failed: no entries in prefix list

Looking for 'collect-ld'

  - failed: no entries in prefix list

Looking for 'ld'

  - failed: no entries in prefix list

Looking for 'ld'

Looking for 'gnm'

  - failed: no entries in prefix list

Looking for 'gnm'

Looking for 'nm'

  - failed: no entries in prefix list

Looking for 'nm'

Looking for 'gstrip'

  - failed: no entries in prefix list

Looking for 'gstrip'

Looking for 'strip'

  - failed: no entries in prefix list

Looking for 'strip'

Looking for 'gcc'

  - failed: no entries in prefix list

Looking for 'gcc'

collect2 version 11.4.1 20231218 (Red Hat 11.4.1-3)

ld_file_name        = /usr/bin/ld

c_file_name         = /usr/bin/gcc

nm_file_name        = /usr/bin/nm

strip_file_name     = /usr/bin/strip

c_file              = libtestrt_sharedd.so.cdtor.c

o_file              = libtestrt_sharedd.so.cdtor.o

/usr/bin/ld -plugin /usr/libexec/gcc/x86_64-redhat-linux/11/liblto_plugin.so -plugin-opt=/usr/libexec/gcc/x86_64-redhat-linux/11/lto-wrapper -plugin-opt=-fresolution=/tmp/ccINdTEJ.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_eh -plugin-opt=-pass-through=-lpthread -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_eh --build-id --no-add-needed --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -shared -o libtestrt_sharedd.so /usr/lib/gcc/x86_64-redhat-linux/11/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/11/crtbeginS.o -L/usr/lib/gcc/x86_64-redhat-linux/11 -L/usr/lib/gcc/x86_64-redhat-linux/11/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/11/../../.. --version-script=/home/admin1/guan/s2_runtime_20240511/s2_runtime/runtime/version-script-testrt.map -soname libtestrt_sharedd.so CMakeFiles/testrt_shared.dir/test_rt/ta.cpp.o CMakeFiles/testrt_shared.dir/test_rt/fatbin_registry.cpp.o CMakeFiles/testrt_shared.dir/test_error.cpp.o CMakeFiles/testrt_shared.dir/test_runtime.cpp.o CMakeFiles/testrt_shared.dir/test_command.cpp.o CMakeFiles/testrt_shared.dir/test_compiler_api.cpp.o CMakeFiles/testrt_shared.dir/test_internal.cpp.o CMakeFiles/testrt_shared.dir/fp16.c.o -ldl -Bstatic -lstdc++ -Bdynamic -lm -lgcc -lgcc_eh -lpthread -lc -lgcc -lgcc_eh /usr/lib/gcc/x86_64-redhat-linux/11/crtendS.o /usr/lib/gcc/x86_64-redhat-linux/11/../../../../lib64/crtn.o

/usr/bin/ld: cannot find -lstdc++

collect2: error: ld returned 1 exit status

怀疑1:系统中是不是不存在libstdc++.so的库。

怀疑2:还是ld执行的时候,给与的查找路径中没有包含libstdc++.so的库。

2.2 缩小case

为了跟踪问题方便,于是引用了参考文献1中的testcase,用最小case复现问题。

#include 
using namespace std;
int main() {
    cout  /lib64/libc.so.6 (0x00007f7fbe400000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f7fbe725000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f7fbea80000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f7fbea59000)
[admin1@localhost work]$
-rwxr-xr-x.  1 admin1 admin1  25K May 16 17:21 hello

而通过静态参数去编译的效果如下:

/usr/bin/c++ helloworld.cpp -static-libstdc++ -o hello

[admin1@localhost work]$ ldd hello
        linux-vdso.so.1 (0x00007ffd0952c000)
        libm.so.6 => /lib64/libm.so.6 (0x00007fd64faf8000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fd64fadd000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fd64f800000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fd64fbdf000)
[admin1@localhost work]$
-rwxr-xr-x.  1 admin1 admin1 1.3M May 16 17:20 hello

编译出来的hello大小,也发生了很大的变化。

 

以下是解决过程中的参考文献。如有侵权请告知,会及时删除。谢谢

参考文献:

1. 采用了以下中的c++ testcase

【C++随记】collect2: error: ld returned 1 exit status错误分析与解决

2. -static-libstdc++的作用

gcc 链接选项-static -static-libstdc++ -static-libgcc使用分析

 

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]