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

创建C语言共享库后调用函数报undefined reference错误,求排查

解决链接共享库时的"undefined reference"错误

你遇到的问题是链接器无法找到共享库中的function1符号,我来一步步帮你排查和解决:

第一步:验证共享库是否包含正确的符号

首先要确认你生成的libcommonheader.so里确实有function1和function2的符号。在终端运行以下命令:

nm -D libcommonheader.so

如果输出里能看到类似下面的条目,说明符号是存在的:

0000000000001129 T function1
0000000000001139 T function2

如果看不到这些条目,说明你生成共享库的过程有问题:

  • 先检查当前目录下是否有func1.o和func2.o这两个目标文件:
    ls *.o
    
  • 如果没有,重新编译目标文件:
    gcc -c -fPIC -o func1.o func1.c
    gcc -c -fPIC -o func2.o func2.c
    
  • 然后重新生成共享库,建议直接指定目标文件而不是用*.o,避免意外包含其他无关文件:
    gcc -shared -o libcommonheader.so func1.o func2.o
    

第二步:调整链接命令的写法

如果共享库符号没问题,但还是报错,可以尝试换一种链接方式,直接指定共享库的路径来编译test.c:

gcc -I. -Wall -o test test.c ./libcommonheader.so

这种写法绕开了链接器的库搜索逻辑,直接把共享库作为输入文件,能快速验证是否是库搜索路径的问题。

如果这种方式能成功,那之前的-L. -lcommonheader写法可能存在以下小问题:

  • 有些系统中,链接器会优先搜索系统库目录,即使你指定了-L.,可以尝试把-L.放在-lcommonheader后面:
    gcc -I. -Wall -o test test.c -lcommonheader -L.
    
  • 另外,确保你运行命令的目录确实是libcommonheader.so所在的目录,避免路径错误。

第三步:排除编译器优化的影响

因为你的function1函数体是空的,有些编译器可能会把它优化掉,导致符号不存在。可以修改func1.c,添加一些实际的代码,比如:

#include "func1.h"
#include <stdio.h>
void function1() {
    printf("This is function1\n");
}

然后重新编译目标文件和共享库,再尝试链接test.c。


内容的提问来源于stack exchange,提问作者himeshi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:06:11