将函数添加到C项目后出现“未定义的引用”错误

时间:2017-01-15 17:36:17

标签: c perl

我已经为wiringPi添加了一个新函数wiringPiVersion(),但是在我构建并安装共享库之后,当我尝试编译一个小的C程序时,我得到:

wpi_ver.c :(。text + 0xc):未定义的引用`wiringPiVersion'

但是,当我将它包含在基于XS的Perl模块中时,一切运行良好。我不太了解C来弄清楚这里出了什么问题,而且我一直在寻找两小时内尝试不同事情的大部分时间无济于事。

这是我测试新功能的小型C程序:

#include <stdio.h>
#include <wiringPi.h>

int main (){
    char * ver = wiringPiVersion();
    printf("wiringPi version: %s\n", ver);
    return 0;
}

抛出错误的编译:

gcc -o ver wpi_ver.c -lwiringPi

添加到wiringPi的头文件:

extern char * wiringPiVersion(void);

wiresPi的.c文件补充:

#define WPI_VERSION "2.36"

char * wiringPiVersion(void){
    return WPI_VERSION;
}

在我的Perl模块的XS文件中,我有:

char *
wiringPiVersion()

...和我的Perl模块的Makefile.PL

LIBS => ['-lwiringPi'],

...在重新安装Perl模块之后,我可以在测试脚本中没有任何问题地访问该函数。

我希望这是一个简单的东西,我忽略了一个人可能会指出的。我的问题是,我该如何纠正这个问题?

2 个答案:

答案 0 :(得分:3)

事实证明,当我重建wiringPi时,生成了两个.so文件...一个在我的主目录下的wiringPi的构建目录中,另一个在/usr/local/lib

在评论中提示后,我明确地添加了库路径:

gcc -o ver wpi_ver.c -L/usr/local/lib -lwiringPi

......这一切都在一起,按预期工作:

$ ./ver
wiringPi version: 2.36

注意:我已经向Gordon发送了补丁,希望它能够包含在下一个wirePi切割中。

更新:我收到了戈登的回复电子邮件,他说当前只有gpio应用程序能够报告版本,所以他建议他要添加类似我的内容未来版本中的补丁。

答案 1 :(得分:1)

虽然已经解决了,但我添加了这个答案来展示给我提示的内容。 错误消息&#34;未定义的引用&#34;指向链接器错误(参见answer on SO),因此它检查是否绘制了正确的库。