我已经为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模块之后,我可以在测试脚本中没有任何问题地访问该函数。
我希望这是一个简单的东西,我忽略了一个人可能会指出的。我的问题是,我该如何纠正这个问题?
答案 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),因此它检查是否绘制了正确的库。