使用Sunix TTY驱动编译报dp_lib_init未定义引用错误如何解决
问题解决步骤
1. 修正编译命令的参数顺序
gcc/g++ 链接时遵循依赖方在前,被依赖方在后的规则,你当前的写法把-lsdxio放在源文件main.cpp之前,链接器处理库文件时还未扫描到main.cpp中对dp_lib_init的引用,不会主动导出库中的对应符号,最终导致找不到定义。
你写的g++ -L-lsdxio main.cpp属于无效参数,-L后必须跟库路径,可直接忽略该写法。
正确的编译命令为:
g++ main.cpp -L/usr/lib -lsdxio
2. 解决C/C++符号名修饰不匹配问题
你使用的libsdxio.so是C语言编译的动态库,导出的符号是纯C格式的dp_lib_init,而你用C编译main.cpp时,如果头文件未做C兼容声明,C编译器会对函数名做名字修饰(Name Mangling),生成类似_Z11dp_lib_initv的修饰后符号,和库中的C格式符号无法匹配。
解决方法:修改main.cpp中头文件的引用逻辑,用extern "C"包裹C库的头文件,告知编译器这部分函数使用C语言的符号规则:
#include <iostream> extern "C" { #include "sdxmng.h" #include "sdxsio.h" } int main() { dp_lib_init(); return 0; }
可选排查项
如果修改后仍有问题,可额外检查两个点:
- 执行
sudo ldconfig刷新系统动态库缓存,确保系统能识别/usr/lib下的libsdxio.so;如果库文件软链接异常,可手动重建:sudo ln -sf /usr/lib/libsdxio.so.9 /usr/lib/libsdxio.so - 执行
file /usr/lib/libsdxio.so确认库架构和你的编译目标架构一致,避免出现32位库链接到64位程序的问题
内容的提问来源于stack exchange,提问作者WhaSukGO
相关产品推荐
相关产品推荐

