SWIG生成的树莓派CEC代码出现未定义符号错误
我想在Python和树莓派的CEC代码之间建立一个接口(比如说,vc_cecservice.h)。为此,我写了一个小的C++文件来开始这个接口的工作。
这个C++文件叫做mycec.cpp:
#include <cstdio>
#include <interface/vmcs_host/vc_cecservice.h>
#include <interface/vchiq_arm/vchiq_if.h>
int openClose() {
VCHI_INSTANCE_T vchiq_instance;
int res = vchi_initialise(&vchiq_instance);
if (res != VCHIQ_SUCCESS) {
printf("failed to open vchiq instance\n");
return -1;
}
if (vchi_connect(NULL, 0, vchiq_instance) != 0) {
printf( "VCHI connection failed\n" );
return -1;
}
VCHI_CONNECTION_T *vchi_connection;
vc_vchi_cec_init(vchiq_instance, &vchi_connection, 1);
vc_vchi_cec_stop();
return 0;
}
我使用SWIG这个工具来生成这个C++文件的CPython接口。
接口文件叫做mycec.i:
%module mycec
%{
extern int openClose();
%}
extern int openClose();
然后,我在树莓派上运行以下的bash脚本来编译代码。
这个脚本叫做build.sh:
#!/bin/bash
swig -python mycec.i
g++ -c -fpic -L=/opt/vc/lib \
-I=/usr/include/python2.7 \
-I=/opt/vc/include/interface/vcos/pthreads -I=/opt/vc/include \
mycec.cpp mycec_wrap.c
g++ -shared -Wl,--no-as-needed -L=/opt/vc/lib \
-I=/usr/include/python2.7 \
-I=/opt/vc/include/interface/vcos/pthreads -I=/opt/vc/include \
-o _mycec.so mycec.o mycec_wrap.o \
-lbcm_host -lvcos -lvchiq_arm
接着,我尝试在python
中加载它:
>>> import _mycec
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: ./_mycec.so: undefined symbol: _Z16vc_vchi_cec_initP29opaque_vchi_instance_handle_tPP17vchi_connection_tj
解码后的名称是vc_vchi_cec_init(opaque_vchi_instance_handle_t*, vchi_connection_t**, unsigned int)
。
$ grep vc_vchi_cec_init /opt/vc/lib/libbcm_host.so
Binary file /opt/vc/lib/libbcm_host.so matches.
谢谢。
1 个回答
0
我在我的 #includes
周围忘记加 extern "C"
了。加上这个就可以正常工作了:
#include <cstdio>
extern "C" {
#include <interface/vmcs_host/vc_cecservice.h>
#include <interface/vchiq_arm/vchiq_if.h>
}
// rest of program...