我是SWIG的新手..我只是尝试了一个简单的项目应用程序来实现SWIG。
代码如下所示:
test.cpp:
#include "dijsdk.h"
#include <iostream>
#include <QString>
#include "arraysize.h"
#inlcude "test.h"
int findcam()
{
error_t result = E_OK;
error_t result1;
QString m_guids[16];
DijSDK_CamGuid guids[ARRAYSIZE(m_guids)] = {0};
unsigned int numGuids = ARRAYSIZE(guids);
result = DijSDK_Init(); //API call
if (result ==0)
result1 = DijSDK_FindCameras(guids, &numGuids); //API call
std::cout<<"\nNumguids = " <<numGuids;
std::cout<<"\nResult = "<<result1;
std::cout<<"\nGuids = "<<guids[0];
return 0;
}
test.h:
/*File test.h*/
int findcam();
test.i:
%module test
%{
#include "dijsdk.h"
#include "arraysize.h"
#inlcude "test.h"
%}
int findcam();
这里dijsdk.h和arraysize.h是第三方头文件。
创建所有这些文件后,我执行了命令
$ swig -c++ -python test.i
这会创建test_wrap.cxx和test.py文件
我正在尝试使用disutils
创建.so文件setup.py:
#!/usr/bin/env python
from distutils.core import setup, Extension
test_module = Extension('_test',
sources=['test_wrap.cxx', 'test.cpp'],
)
setup (name = 'example',
version = '0.1',
author = "SWIG Docs",
description = """Simple swig example from docs""",
ext_modules = [test_module],
py_modules = ["test"],
)
我刚刚提到这个link并创建了这些文件,我可能在脚本的某个地方错了,正确的我。
由于我的test.cpp文件包含qt头文件和第三方文件,我通过在变量CPLUS_INCLUDE_PATH中包含它们的路径来编译文件
$ python setup.py build_ext --inplace
CPLUS_INCLUDE_PATH的内容是:
"/usr/include/python2.7/,/usr/include/qt4,/usr/include/qt4/QtCore,/usr/include/qt4/QtGui,/home/user/Desktop/SwingTest/"
所有这些步骤都会创建一个成功的_test.so文件。现在,在导入此_test.so文件时,我收到以下错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "test.py", line 26, in <module>
_test = swig_import_helper()
File "test.py", line 22, in swig_import_helper
_mod = imp.load_module('_test', fp, pathname, description)
ImportError: ./_test.so: undefined symbol: _ZN7QString11shared_nullE
从错误我可以看出它是一个QT链接错误。虽然我在变量CPLUS_INCLUDE_PATH中包含路径但为什么它仍然失败?
任何帮助都会非常感激....