链接自定义C共享库时g++报undefined reference错误求助
问题原因与解决方法
核心问题
你遇到的是C++与C代码的名字修饰不兼容导致的链接错误:
- C++编译器会对函数名进行「名字修饰」(比如将
myfunc()转换为_Z6myfuncv这类带额外信息的符号名),以支持函数重载等特性。 - 你的
libfoo.so是用C语言编译的,函数名保持原始的myfunc、foo无修饰状态,因此链接器无法找到C++代码中被修饰后的符号匹配项。
解决步骤
1. 在C++代码中声明C风格函数
在test.cpp中,用extern "C"包裹对C库函数的声明,告诉编译器按C规则处理这些函数的名字:
// 直接声明C库函数的方式 extern "C" { void myfunc(); void foo(); } // 如果有对应的C头文件(如foo.h),更推荐这种方式 extern "C" { #include "foo.h" }
2. 确认C库的编译方式
确保libfoo.so是用C编译器(gcc)而非C++编译器(g++)编译的,编译命令示例:
gcc -fPIC -shared foo.c -o libfoo.so
-fPIC用于生成位置无关代码,是编译共享库的必要选项。
3. 验证符号与编译命令
- 用以下命令确认库中的符号是C风格无修饰的:
输出应显示类似nm -D /home/xyz/customlib/libfoo.so | grep -E "myfunc|foo"0000000000001122 T myfunc的结果,没有复杂的修饰前缀。 - 可调整编译命令的顺序(部分链接器要求库放在依赖它的源文件之后):
g++ test.cpp -Og -g3 -ggdb -fsanitize=address -L/home/xyz/customlib -o test -lfoo
内容的提问来源于stack exchange,提问作者Setu
相关产品推荐
相关产品推荐

