-
Notifications
You must be signed in to change notification settings - Fork 4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
紧急求助:报错 symbol lookup error: /usr/local/lib/libbrpc.so: undefined symbol: pthread_mutex_lock #2266
Comments
您好,我已注释掉这两个函数,如图: 辛苦再帮忙看下,非常感谢! |
您好,在之前回复的去除pthread_mutex_lock和pthread_mutex_unlock的基础上我又注释掉了上述的全局变量,具体如下: 注释掉之后运行主函数没有再报错了。 |
会导致内置服务中的contention profiler不可用 |
了解了。那我们暂不开启这个功能,先用去除掉这部分代码的brpc调试。 |
@tangtang5156 可以试试使用 |
Describe the bug (描述bug)
运行可执行文件时报错symbol lookup error: /usr/local/lib/libbrpc.so: undefined symbol: pthread_mutex_lock
To Reproduce (复现方法)
尝试多种使用方法,发现在如下场景下可复现报错:
1、编译产出libhttpserver.so(使用c++开发),该so依赖brpc,cmake选项如下:
set(DYNAMIC_LIB
# ${CMAKE_THREAD_LIBS_INIT}
${GFLAGS_LIBRARY}
${PROTOBUF_LIBRARIES}
${LEVELDB_LIB}
${OPENSSL_CRYPTO_LIBRARY}
${OPENSSL_SSL_LIBRARY}
# ${THRIFT_LIB}
# ${THRIFTNB_LIB}
dl
)
TARGET_LINK_LIBRARIES(httpserver proto brpc ${DYNAMIC_LIB} pthread)
(此时直接使用httpserver链接到其他可执行文件时不会报错)
2、产出B.so(使用c开发),B.so使用到了httpserver中的功能,故依赖了httpserver.so,cmake选项如下:
ADD_LIBRARY(B SHARED jiangdan.c)
TARGET_LINK_LIBRARIES(B httpserver)
3、产出可执行文件main(使用c开发),main中使用到了B.so的功能,故依赖了B.so,同时C中使用到了pthread的功能,也依赖了pthread,cmake选项如下(已经将B放在pthread的前面):
ADD_EXECUTABLE(main main.c)
TARGET_LINK_LIBRARIES(main B pthread)
4、此时编译项目即cmake ..&& make结果正常,但是运行main时会报错:
symbol lookup error: /usr/local/lib/libbrpc.so: undefined symbol: pthread_mutex_lock
Expected behavior (期望行为)
测试过程发现,若可执行文件直接依赖httpserver和pthread时不会报错,可正常运行;但是只要中间再多层依赖,这种方式就会报错。但是项目依赖方很多,其他项目均是依赖httpserver做二次so的开发,无法规避多层依赖问题。
预期:执行main时可正常执行。不管是通过链接静态brpc还是动态brpc,只要有解决方式即可。
已排查了多天无果,紧急求助。
Versions (各种版本)
OS: linux ubuntu
Compiler:
brpc: 尝试了几个版本包括最新的1.5.0均会报错
protobuf:
Additional context/screenshots (更多上下文/截图)
其他尝试的解决方案,比如动态brpc改为静态brpc,仍然无法解决,过程如下:
1、为解决上述问题,尝试将httpserver链接静态brpc,如:
TARGET_LINK_LIBRARIES(httpserver proto libbrpc.a ${DYNAMIC_LIB} pthread)
修改后再重新执行main,不再提示brpc缺失,而是提示依赖libbrpc.a的httpserver.so缺失:
symbol lookup error: /usr/local/lib/libhttpserver: undefined symbol: pthread_mutex_lock
2、为解决问题1,则尝试将brpc.a的所有符号均链接进来,如
TARGET_LINK_LIBRARIES(httpserver proto "-Wl,--whole-archive" libbrpc.a "-Wl,--no-whole-archive" ${DYNAMIC_LIB} pthread)
修改后再重新执行main,代码直接段错误崩溃,debug后发现崩溃点在于如下图:
The text was updated successfully, but these errors were encountered: