编译运行错误排查方法转载

原创
小哥 3年前 (2022-10-17) 阅读数 51 #大杂烩

目录

编译时找不到头文件编译时找不到头文件编译时找不到头文件

  • 编译flags -v显示所有头文件搜索路径显示所有头文件搜索路径显示所有头文件搜索路径
  • 宏是打开的是宏打开的是打开的
  • 编译flags是指定的是指定的是它指定的吗-I路径
  • 头文件和头文件的头文件#error "xxxx"如果将此头文件编译为,则会报告错误

编译时找不到符号编译时找不到符号编译时找不到符号

  • 源文件/标题是编译进来的吗?正在编译的标头是否为编译的标头文件
  • 是符号是否是这个符号是这个符号extern的
  • 用c++编译,添加或不添加extern "C"
  • 是否有未打开的宏?是否有未打开的宏
  • 头文件交叉包含的存在对头文件交叉包含的存在对头文件交叉包含的存在

编译时找不到库编译时找不到库编译时找不到库

  • 链接flags -v, 显示所有库搜索路径显示所有库搜索路径
  • 链接flags是指定的是指定的是它指定的吗-L路径
  • -L库是否存在于路径下
  • 默认动态库搜索路径默认动态库搜索路径 /lib, /usr/lib, /usr/local/lib库是否存在等:库是否存在
  • 库是否与当前工具链不一致

找不到运行库找不到运行库找不到运行库

运行库搜索路径顺序运行库搜索路径顺序运行时库搜索路径顺序运行时库搜索路径序列运行时库搜索路径序列

  1. 链接时,-Wl,-rpath=first_path:second_path指定的动态库搜索路径指定的动态库搜索路径指定的动态库搜索路径指定的动态库搜索路径指定的动态库搜索路径指定的动态库搜索路径指定的动态库搜索路径指定的动态库搜索路径指定的动态库搜索路径
  2. 环境变量LD_LIBRARY_PATH指定的动态库搜索路径指定的动态库搜索路径指定的动态库搜索路径指定的动态库搜索路径指定的动态库搜索路径指定的动态库搜索路径指定的动态库搜索路径指定的动态库搜索路径指定的动态库搜索路径
  3. 配置文件/etc/ld.so.conf中指定的动态库搜索路径中指定的动态库搜索路径指定的动态库搜索路径指定的动态库搜索路径指定的动态库搜索路径指定的动态库搜索路径指定的动态库搜索路径指定的动态库搜索路径指定的动态库搜索路径指定的动态库搜索路径
  4. 默认动态库搜索路径默认动态库搜索路径/lib, /usr/lib

运行库搜索路径视图运行时库搜索路径视图运行时库搜索路径视图

  • ldd program_name (ldd是个shell脚本)

    ldd ./exe_json linux-vdso.so.1 => (0x00007ffdfd3ed000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f2441ae6000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f24417dd000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2441413000) /lib64/ld-linux-x86-64.so.2 (0x00007f2441d03000)

  • strace -e trace=open program_name

(部分嵌入部分嵌入部分嵌入linux系统在不启用此功能的情况下编译固件)

strace -e trace=open ./exe_json 
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libm.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
+++ exited with 0 +++

调整不同刀具链时找不到符号

  • 不同工具链对某些符号定义的宏观控制

    eg:struct sockaddr_in要为结构打开的宏需要为结构打开的宏

    • linux PC: -D_GNU_SOURCE
    • linux rk3308: -D_POSIX_C_SOURCE=200112L -D_DEFAULT_SOURCE

不同的工具链编译不正确运行的程序

  • 大小端
  • 32位/64位
  • -O2优化导致的错误(例如,在网络通信期间)mbedtls报告加密和解密错误报告加密和解密错误报告加密和解密错误),改成-O0

参考

转载于:https://www.cnblogs.com/pukaifei/p/11280270.html

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门