运行出现符号问题 symbol lookup error

gucheng789 2019-08-21 02:47:57

运行出现符号问题
symbol lookup error: ../bin/libBykh.so: undefined symbol: _ZN4Json5ValueC1El

查看对应的符号,是未定义
[root@localhost bin]# nm libBykh.so | grep '_ZN4Json5ValueC1El'
U _ZN4Json5ValueC1El

-----------------------------------------------------------------------------------------------------

用的是静态链接 libjsoncpp.a 库
target_link_libraries(Bykh libjsoncpp.a)


查看符号全名
[root@localhost bin]# c++filt _ZN4Json5ValueC1El
Json::Value::Value(long)

-----------------------------------------------------------------------------------------------------

代码如下:
long xb = 88888888888;
Json::Value root;
Json::FastWriter writer;
root["xb"] = xb;

-----------------------------------------------------------------------------------------------------

查看 libjsoncpp.a 里却没有 _ZN4Json5ValueC1El ,有点奇怪

[root@localhost lib]# nm libjsoncpp.a | grep '_ZN4Json5ValueC1E*'
U _ZN4Json5ValueC1Eb
U _ZN4Json5ValueC1Ed
U _ZN4Json5ValueC1Ei
U _ZN4Json5ValueC1ENS_9ValueTypeE
U _ZN4Json5ValueC1ERKS0_
U _ZN4Json5ValueC1ERKSs
U _ZN4Json5ValueC1Ex
U _ZN4Json5ValueC1Ey
0000000000002840 T _ZN4Json5ValueC1Eb
00000000000027e0 T _ZN4Json5ValueC1Ed
0000000000002720 T _ZN4Json5ValueC1Ei
0000000000002750 T _ZN4Json5ValueC1Ej
00000000000028a0 T _ZN4Json5ValueC1ENS_9ValueTypeE
0000000000002870 T _ZN4Json5ValueC1EOS0_
0000000000002930 T _ZN4Json5ValueC1EPKc
0000000000002970 T _ZN4Json5ValueC1EPKcS2_
0000000000002810 T _ZN4Json5ValueC1ERKNS_12StaticStringE
0000000000005130 T _ZN4Json5ValueC1ERKS0_
0000000000002a80 T _ZN4Json5ValueC1ERKSs
0000000000002780 T _ZN4Json5ValueC1Ex
00000000000027b0 T _ZN4Json5ValueC1Ey
U _ZN4Json5ValueC1Eb
U _ZN4Json5ValueC1Ei
U _ZN4Json5ValueC1ENS_9ValueTypeE
U _ZN4Json5ValueC1EPKc
U _ZN4Json5ValueC1ERKS0_





...全文
2417 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
klavien 2019-08-25
  • 打赏
  • 举报
回复
运行时报符号错误这种基本上就是你编译时候链接的库与你程序运行时候链接的库不一样,常见的就是后来升级或重编了jsoncpp库,没有加一些编译选项。比如jsoncpp源码中有这个
Value( ValueType type = nullValue );
Value( Int value );
Value( UInt value );
#if defined(JSON_HAS_INT64)
Value( Int64 value );
Value( UInt64 value );
#endif // if defined(JSON_HAS_INT64)
Value( double value );
Value( const char *value );
Value( const char *beginValue, const char *endValue );
一般int64就是长整形,但要有JSON_HAS_INT64选项。


引用 2 楼 gucheng789 的回复:
有没有办法在编译的时候就知道 _ZN4Json5ValueC1El 不存在呢?
而不是在运行的时候找不到直接挂了。


编译库的时候编译器默认会对所链接的库做检查的,如果你的库是编译器符号未定义的话会报错的。
gucheng789 2019-08-21
  • 打赏
  • 举报
回复
有没有办法在编译的时候就知道 _ZN4Json5ValueC1El 不存在呢? 而不是在运行的时候找不到直接挂了。
赵4老师 2019-08-21
  • 打赏
  • 举报
回复
百度搜“Name Mangling in C++.txt”

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧