Linux 编译链接那些事儿(02)C++链接库std::__cxx11::basic_string和std::__1::basic_string链接问题总结
1 问题背景说明
在自己的项目源码中引用libeasysqlite.so时编译成功,但运行时遇到问题直接报错,找不到符号 symbol:_ZN3sql5FieldC1ENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_10field_typeEi。
2 问题描述和解读
使用c++filt查看符号表中未知的这个符号
$c++filt _ZN3sql5FieldC1ENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_10field_typeEisql::Field::Field(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, sql::field_type, int)
查询到该符号对应的真实函数为:
sql::Field::Field(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, sql::field_type, int)
接下来在使用nm命令查询libeasysqlite.so,看是否有该符号对应的函数。使用nm命令查看,如下所示:
.../data/sqlite/build$ nm -gC libeasysqlite.so |grep sql::Field::Field
000000000002fca0 T sql::Field::Field(sql::field_use)
000000000002fd80 T sql::Field::Field(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, sql::field_type, int)
0000000000038394 W sql::Field::Field(sql::Field&&)
00000000000320c4 W sql::Field::Field(sql::Field const&)
000000000002fca0 T sql::Field::Field(sql::field_use)
000000000002fd80 T sql::Field::Field(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, sql::field_type, int)
0000000000038394 W sql::Field::Field(sql::Field&&)
00000000000320c4 W sql::Field::Field(sql::Field const&)
这里发现并没有我们需要的sql::Field::Field(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, sql::field_type, int)方法,而是有一个类似的sql::Field::Field(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, sql::field_type, int)方法,这就说明有可能是编译时使用的链接库不同而导致的问题。
这里是cxx11空间,对应的是 C++11版本的链接库,而我们需要的是__1空间的库,也就是C++03版本的链接库。那么如何修改呢?就是在CMakeList.txt文件中添加一些参数,如下所示:
set(CMAKE_CXX_COMPILER clang++-14)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -stdlib=libc++")
重新编译libeasysqlite.so库。这样在编译生成库的时候就会强制使用C++03版本的标准了,再次make编译出sql库即可。
接下来开始测试该库。修改后执行nm命令查看,如下所示:
.../data/sqlite/build$ nm -gC libeasysqlite.so |grep sql::Field::Field
00000000000244b0 T sql::Field::Field(sql::field_use)
0000000000024590 T sql::Field::Field(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, sql::field_type, int)
00000000000244b0 T sql::Field::Field(sql::field_use)
0000000000024590 T sql::Field::Field(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, sql::field_type, int)
0000000000029e54 W sql::Field::Field(sql::Field&&)
000000000002734c W sql::Field::Field(sql::Field const&)
这样就和我们需要的对上了。
3 问题总结
该类问题的解决步骤如下所示:
- 遇到这类问题时基本上都是使用c++filt来将符号表中的符号转换。
- 确认符号是否在库中,如果不在库中那么可能是链接库的版本或者编译方式不对。
- 修正编译方式/库的版本,确认符号表中的符号可以对上。接下来进行实测即可。
相关文章:
Linux 编译链接那些事儿(02)C++链接库std::__cxx11::basic_string和std::__1::basic_string链接问题总结
1 问题背景说明 在自己的项目源码中引用libeasysqlite.so时编译成功,但运行时遇到问题直接报错,找不到符号 symbol:_ZN3sql5FieldC1ENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_10field_typeEi。 2 问题描述和解…...
按键精灵中的UI界面操作
1. 按键精灵中UI界面常用的控件 1. 文字框 界面1: {标签页1:{文字框:{名称:"文字框1",显示内容:"显示内容",文字大小:0,高度:0,宽度:0,注释:"文字大小、高度、宽度是可选属性,如需使用默认值,可保持值为0或直接删除此属性&qu…...
dpdk 程序如何配置网卡收发包队列描述符配置?
问题描述 dpdk 程序在配置网卡队列时会涉及收发包队列描述符数量配置问题,收发包描述符的数量看似是一个简单的配置,却对转发性能有着一定的影响。实际业务程序中,收发包描述符大小配置一般参考 dpdk 内部示例程序配置进行,经验之…...
二蛋赠书七期:《云原生数据中台:架构、方法论与实践》
前言 大家好!我是二蛋,一个热爱技术、乐于分享的工程师。在过去的几年里,我一直通过各种渠道与大家分享技术知识和经验。我深知,每一位技术人员都对自己的技能提升和职业发展有着热切的期待。因此,我非常感激大家一直…...
计算机毕设 基于大数据的服务器数据分析与可视化系统 -python 可视化 大数据
文章目录 0 前言1 课题背景2 实现效果3 数据收集分析过程**总体框架图****kafka 创建日志主题****flume 收集日志写到 kafka****python 读取 kafka 实时处理****数据分析可视化** 4 Flask框架5 最后 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升&a…...
初识rust
调试下rust 的执行流程 参考: 认识 Cargo - Rust语言圣经(Rust Course) 新建一个hello world 程序: fn main() {println!("Hello, world!"); }用IDA 打开exe,并加载符号: 根据字符串找到主程序入口: 双击…...
shiro-cve2016-4437漏洞复现
一、漏洞特征 Apache Shiro是一款开源强大且易用的Java安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性。 因为在反序列化时,不会对其进行过滤,所以如果传入恶意代码将会造成安全问题 在 1.2.4 版本前, 加…...
【MongoDB-Redis-MySQL-Elasticsearch-Kibana-RabbitMQ-MinIO】Java全栈开发软件一网打尽
“Java全栈开发一网打尽:在Windows环境下探索技术世界的奇妙之旅” 前言 全栈开发是一项复杂而令人兴奋的任务,涵盖了从前端到后端、数据库到可视化层、消息队列到文件存储的广泛领域。本文将带您深入探讨在Windows环境下进行全栈开发的过程࿰…...
Implementing class错误解决
最近在使用IDEASmart Tomcat启动项目时,报以下错误: Injection of resource dependencies failed; nested exception is java.lang.IncompatibleClassChangeError: Implementing class根据网上结论加上我这里的原因,总共以下几个方面&#x…...
关于 国产系统UOS系统Qt开发Tcp服务器外部连接无法连接上USO系统 的解决方法
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/134254817 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…...
初阶JavaEE(15)(Cookie 和 Session、理解会话机制 (Session)、实现用户登录网页、上传文件网页、常用的代码片段)
接上次博客:初阶JavaEE(14)表白墙程序-CSDN博客 Cookie 和 Session 你还记得我们之前提到的Cookie吗? Cookie是HTTP请求header中的一个属性,是一种用于在浏览器和服务器之间持久存储数据的机制,允许网站…...
C++入门学习(1)命名空间和输入输出
前言 在C语言和基本的数据结构学习之后,我们终于迎来了期待已久的C啦!C发明出来的意义就是填补一些C语言的不足,让我们更加方便的写代码,所以今天我们就来讲一下C语言不足的地方和在C中的解决办法! 一、命名空间 在学习…...
AI:58-基于深度学习的猫狗图像识别
🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…...
【原创】java+swing+mysql宠物领养管理系统设计与实现
摘要: 生活中,有很多被人遗弃的宠物,这些宠物的处理成为了一个新的难题。生活中也有许多人喜欢养宠物,为了方便大家进行宠物领养,提高宠物领养管理的效率和便利性。本文针对这一问题,提出设计和实现一个基…...
虚拟机Linux-Centos系统网络配置常用命令+Docker 的常用命令
目录 1、虚拟机Linux-Centos系统网络配置常用命令2、Docker 的常用命令2.1 安装docker步骤命令2.2 在docker容器中安装和运行mysql 2、dockerfile关键字区别(ADD/COPY,CMD/ENTRYPOINT) 1、虚拟机Linux-Centos系统网络配置常用命令 进入网络配置文件目录 cd /etc/sysconfig/ne…...
数据分析相关知识整理_--秋招面试版
一、关于sql语句(常问) 1)sql写过的复杂的运算 聚合函数,case when then end语句进行条件运算,字符串的截取、替换,日期的运算,排名等等;行列转换; eg:行列转换 SELE…...
HMM与LTP词性标注之命名实体识别与HMM
文章目录 知识图谱介绍NLP应用场景知识图谱(Neo4j演示)命名实体识别模型架构讲解HMM与CRFHMM五大要素(两大状态与三大概率)HMM案例分享HMM实体识别应用场景代码实现 知识图谱介绍 NLP应用场景 图谱的本质,就是把自然…...
Sui发布RPC2.0 Beta,拥抱GraphQL并计划弃用JSON-RPC
为了解决现有RPC存在的许多已知问题,Sui正在准备推出一个基于GraphQL的新RPC服务,名为Sui RPC 2.0。GraphQL是一种开源数据查询和操作语言,旨在简化需要复杂数据查询的API和服务。 用户目前可以访问Sui主网和测试网网络的Beta版本的只读快照…...
设计模式—结构型模式之桥接模式
设计模式—结构型模式之桥接模式 将抽象与实现解耦,使两者都可以独立变化。 在现实生活中,某些类具有两个或多个维度的变化,如图形既可按形状分,又可按颜色分。如何设计类似于 Photoshop 这样的软件,能画不同形状和不…...
【RabbitMQ】RabbitMQ 消息的堆积问题 —— 使用惰性队列解决消息的堆积问题
文章目录 一、消息的堆积问题1.1 什么是消息的堆积问题1.2 消息堆积的解决思路 二、惰性队列解决消息堆积问题2.1 惰性队列和普通队列的区别2.2 惰性队列的声明方式2.3 演示惰性队列接收大量消息2.4 惰性队列的优缺点 一、消息的堆积问题 1.1 什么是消息的堆积问题 消息的堆积…...
Go语言中的Interface:面向接口编程
Go语言中的Interface:面向接口编程 1. Interface的基本概念 Interface是Go语言中用于定义行为的一种类型,它指定了一组方法签名,但不提供具体实现。Interface是Go语言实现多态和解耦的核心机制,也是面向接口编程的基础。 Go语言的…...
LeetCode 热题 100(每日两题)-Day2
坚持打卡第二天!昨天的哈希表大显神威,今天我们将继续探索哈希集合的妙用,并引入数组操作中极其重要的技巧——双指针(快慢指针)。一、最长连续序列LeetCode 第 128 题,难度中等。这道题的难点在于题目强制…...
华帝COO韩伟:破局立新,“全域协同、效率革命”迎战行业新周期
3月30日,华帝“人生净界”新品发布会在杭州举行。这场发布会,不仅官宣全新代言人张凌赫并重磅发布非遗美学瓷话套系,清晰地传递出华帝面向未来的战略航向。发布会上,华帝股份副总裁兼COO韩伟深度剖析厨电行业变革趋势,…...
Ubuntu 20.04 无头服务器福音:5分钟搞定虚拟显示器,让NoMachine远程桌面丝滑如本地
Ubuntu 20.04 无头服务器虚拟显示器终极配置指南 当你面对一台没有物理显示器的Ubuntu服务器时,远程桌面连接往往会遇到各种令人抓狂的问题——黑屏、卡顿、分辨率异常。作为长期管理分布式服务器的运维工程师,我深刻理解这种困境对工作效率的影响。本文…...
Lychee Rerank MM GPU算力:Qwen2.5-VL 7B模型在A10上16GB显存高效运行
Lychee Rerank MM GPU算力:Qwen2.5-VL 7B模型在A10上16GB显存高效运行 1. 引言:当多模态检索遇到“选择困难症” 想象一下,你正在一个庞大的多媒体资料库里搜索。你输入“一只在草地上玩耍的棕色小狗”,系统返回了100个结果&…...
如何让数学公式编辑达到手写速度:Obsidian LaTeX Suite深度解析
如何让数学公式编辑达到手写速度:Obsidian LaTeX Suite深度解析 【免费下载链接】obsidian-latex-suite Make typesetting LaTeX as fast as handwriting through snippets, text expansion, and editor enhancements 项目地址: https://gitcode.com/gh_mirrors/o…...
断更 9 天放大招!OpenClaw 3.22 版全维度升级,龙虾这次真的变超强
各位技术圈的小伙伴,学长来给大家同步个重磅消息!火遍全网的 OpenClaw 断更 9 天之后,直接甩出王炸 ——2026.3.22-beta.1 预览版正式上线,这次可不是小修小补,而是从插件架构到安全防护、从模型配置到交互体验的底层大…...
新手也能看懂!5分钟搞懂图像频谱图:用MATLAB的fft2和fftshift分析图片细节
图像频谱图解析:用MATLAB透视照片的隐藏密码 想象一下,如果每张照片都能像X光片一样被"透视",让我们看到它内部隐藏的结构特征,那会怎样?这就是图像频谱图的魔力所在。不同于我们日常看到的像素排列…...
多模态学习:结合文本和图像的旋转判断
多模态学习:结合文本和图像的旋转判断 1. 引言 你有没有遇到过这样的情况:拍了一张带文字的图片,结果发现方向不对,需要手动旋转才能正常阅读?传统的图像旋转判断方法往往只依赖视觉特征,对于包含文字的图…...
别再只用#if DEBUG了!C#预处理器指令的5个实战妙用(含#warning、#pragma避坑)
别再只用#if DEBUG了!C#预处理器指令的5个实战妙用(含#warning、#pragma避坑) 在C#开发中,预处理器指令往往被简化为#if DEBUG的单一用途,这就像只把瑞士军刀当作开瓶器使用。实际上,这套工具能在代码质量管…...
