创建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
相关产品推荐
相关产品推荐

