• C/C++ link-undefined 问题总结


    可能问题

    1. 没有链接对应的库;

    2. 如果是静态库可能是库的链接顺序的问题;可以通过-Wl,--start-group -Wl,--end-group来排查;

    3. 链接到错误的库,其他库中存在同名但是定义不同的函数,此时找到对应的错误链接的库,并将其改到合适的位置,或者删除;

    4. -D_GLIBCXX_USE_CXX11_ABI=1,What is the "C++ ABI Specification" referred to in GCC's manual? - Stack Overflow 这种情况下还是3的问题,还是的签名没有对应。

    ld 杂记

    搜索顺序

    动态链接库的搜索顺序

       1. 编译目标代码时指定的动态库搜索路径

       2. 环境变量LD_LIBRARY_PATH指定的动态库搜索路径

       3. 配置文件/etc/ld.so.conf中指定的动态库搜索路径

       4. 默认的动态库搜索路径/lib 

       5. 默认的动态库搜索路径/usr/lib 


    静态链接库的搜索顺序

       1. ld会去找GCC命令中的参数-L

       2. 再找gcc的环境变量LIBRARY_PATH

       3. 再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的 
     

    查看ld的搜索路径:

    /usr/bin/ld --verbose | grep SEARCH

    cmake 显示g++ command过程

    set(CMAKE_VERBOSE_MAKEFILE on)

    cmake 显示ld command过程

    target_link_libraries(name INTERFACE -Wl,-v lib-name)

    查看依赖

    查看执行文件的依赖:

    ldd exec-file

    产看so的依赖:

    objdump -x *.so | grep NEEDED

    CMake-CPM的使用

    1. CMake Error at /disk4/xinrong.ypc/onnxruntime/build/Linux/Debug/_deps/rapids-cmake-src/rapids-cmake/cpm/find.cmake:152 (CPMFindPackage):
    2. Unknown CMake command "CPMFindPackage".
    3. Call Stack (most recent call first):
    4. /disk4/xinrong.ypc/onnxruntime/build/Linux/Debug/_deps/rapids-cmake-src/rapids-cmake/cpm/thrust.cmake:72 (rapids_cpm_find)
    5. external/cuCollections/cmake/thirdparty/get_thrust.cmake:18 (rapids_cpm_thrust)
    6. external/cuCollections/cmake/thirdparty/get_thrust.cmake:22 (find_and_configure_thrust)
    7. external/cuCollections/CMakeLists.txt:62 (include)

     原因可能是:CPM对应的cmake文件(里面包含了CPMFindPackage的实现)没有下载成功。

    GDB 查看连续内存块内容

    格式

    x /nfu

    参数说明

    • x是 examine 的缩写
    • n表示要显示的内存单元的个数
    • f表示显示方式, 可取如下值

                    x 按十六进制格式显示变量
                    d 按十进制格式显示变量
                    u 按十进制格式显示无符号整型
                    o 按八进制格式显示变量
                    t 按二进制格式显示变量
                    a 按十六进制格式显示变量
                    i 指令地址格式
                    c 按字符格式显示变量
                    f 按浮点数格式显示变量

    • u表示一个地址单元的长度

                    b表示单字节
                    h表示双字节
                    w表示四字节
                    g表示八字节

    看到vector变量:

    链接问题

    动态库链接静态库时

    报relocation的错误,原因在于动态库链接静态库libprotobuf.a时,使用了-fPIC,但是编译libprotobuf.a时没有用-fPIC,导致libprotobuf.a的代码定向失败。PIC,全称是Position Independent Code,加了后,生成的库的起始地址就不再是0,而是相对地址,加载时会进行两次跳转,并由dynamic-loader(ld-linux.so)填充最终跳转地址。

    解决方案

            编译libprotobuf.a时,也加上-fPIC。

            注意:-fPIC对静态库和动态库都可以加。主要是对跳转的地址编码方式不同。

    参考

    linux中的ld命令及其搜索路径顺序_Cc1924的博客-CSDN博客_ld命令

    学习笔记:relocation R_X86_64_32 against `.rodata‘ can not be used when making a shared object;_fanchenxinok的博客-CSDN博客 gcc 编译参数 -fPIC 作用_Ruo_Xiao的博客-CSDN博客_fpic
    GCC -fPIC 选项生成位置无关代码(Position-Independent Code) – 悠然品鉴-

  • 相关阅读:
    JAVA-线程
    Android 验证启动模式
    前端插件库之vue3使用vue-codemirror插件
    实现Runnable接口
    Redis从入门到精通(二十一)Redis最佳实践(二)mset、pipeline、慢查询优化、内存划分
    Git常用指令
    【Java 进阶篇】Ajax 实现——原生JS方式
    操作系统复习【面试】
    数据链路层知识分享【计算机网络】【以太网帧 | MTU的影响 | ARP技术】
    ffmpeg视频截取时DTS乱序导致无法截取的问题
  • 原文地址:https://blog.csdn.net/u014267567/article/details/126758884