You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

链接自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 14:01:02