这是我目前的.i文件:
%module HiveGPS
%{
#include "ou_thread.h"
#include "HiveGPS.h"
%}
%include ou_thread.h
%include HiveGPS.h
我已经漫画来获取.py和.pyc文件。现在,根据我的理解,为了运行我的.py文件,我需要将它链接到我的.pyd文件,但是当我尝试使用VS2010使用上面列出的设置构建我的项目时,它会抱怨Thread类我我正在使用:
1>------ Build started: Project: HiveGPS, Configuration: Release Win32 ------
1>Build started 5/11/2011 1:41:30 PM.
1>InitializeBuildStatus:
1> Touching "Release\HiveGPS.unsuccessfulbuild".
1>ClCompile:
1> HiveGPS_wrap.cpp
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(57): error C2146: syntax error : missing ';' before identifier 'm_strName'
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(57): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(57): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(64): error C2146: syntax error : missing ';' before identifier 'getName'
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(64): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(64): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(64): warning C4183: 'getName': missing return type; assumed to be a member function returning 'int'
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(98): error C2146: syntax error : missing ';' before identifier 'm_strName'
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(98): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(98): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(104): error C2146: syntax error : missing ';' before identifier 'getName'
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(104): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(104): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(104): warning C4183: 'getName': missing return type; assumed to be a member function returning 'int'
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(115): error C2146: syntax error : missing ';' before identifier 'msg'
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(115): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(115): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(118): error C2146: syntax error : missing ';' before identifier 'getMessage'
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(118): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(118): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(118): warning C4183: 'getMessage': missing return type; assumed to be a member function returning 'int'
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(51): error C2011: 'openutils::Thread' : 'class' type redefinition
1> c:\users\*\desktop\hivegps\hivegps\ou_thread.h(51) : see declaration of 'openutils::Thread'
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(93): error C2011: 'openutils::Mutex' : 'class' type redefinition
1> c:\users\*\desktop\hivegps\hivegps\ou_thread.h(93) : see declaration of 'openutils::Mutex'
1>c:\users\*\desktop\hivegps\hivegps\ou_thread.h(113): error C2011: 'openutils::ThreadException' : 'class' type redefinition
1> c:\users\*\desktop\hivegps\hivegps\ou_thread.h(113) : see declaration of 'openutils::ThreadException'
1>c:\users\*\desktop\hivegps\hivegps\HiveGPS.h(29): error C2504: 'openutils::Thread' : base class undefined
1>c:\users\*\desktop\hivegps\hivegps\HiveGPS.h(53): error C2079: 'HiveGPS::readWriteMutex' uses undefined class 'openutils::Mutex'
1>HiveGPS_wrap.cpp(3086): error C2027: use of undefined type 'openutils::Thread'
1> c:\users\*\desktop\hivegps\hivegps\ou_thread.h(51) : see declaration of 'openutils::Thread'
1>HiveGPS_wrap.cpp(3086): fatal error C1903: unable to recover from previous error(s); stopping compilation
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:02.10
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
所有这些错误(减去最后一个)基本上都是说String类是以某种方式实现的,它是否与Python对String类的定义相冲突?最后一个错误是抱怨Thread类,这可能是同样的问题吗?
所有这些都说: 有人能告诉我我做错了什么,或者更好的是,请指教我如何为VS2010做这个(SWIG网站是2008年)。
如果无法做到,我可以将生成的.py文件以某种方式链接到.dll文件吗?
很抱歉这个问题很长,但我对这个问题感到很失落,所以我决定解释一切。
答案 0 :(得分:11)
好的,我正在使用swig和VS2010没问题......
在您的情况下,看起来更像是链接问题。除了检查库之外,别忘了检查要链接的32-64位库。尝试将所有x86目标链接为故障安全。并且不要使用 AnyCpu 。
如何在VS2010下使用SWIG。
让我们定义你想要获取mylib.py,所以你用mylib.i作为“主”文件创建了一些SWIG接口文件。我假设你已经有了一个带有C ++类的项目的解决方案。
(1)首先为SWIG界面创建C ++项目。使用Visual C ++ - >类库项目,它应该创建一个C ++ DLL存根。我把所有.i文件放在那里。并设置视觉工作室以突出.i为.h - 它很方便。
(1.1)将mylib_wrap.cxx文件添加到项目中(在swig尚未生成文件时创建空文件)
<强>(2)强>
a)在mylib.i上按右键,选择属性
b)将ItemType设置为“自定义构建工具”
在自定义构建步骤窗口中:
c)命令行字段应该类似于:
echo In order to function correctly, please ensure the following environment variables are
correctly set:
echo PYTHON_INCLUDE: %PYTHON_INCLUDE%
echo PYTHON_LIB: %PYTHON_LIB%
echo on
C:\swig\swig.exe -c++ -python %(FullPath)
将C:\ swig \ swig.exe更改为您的SWIG路径
d)在输出字段中:
$(InputName)_wrap.cxx
(3)转到此项目属性:
a) C ++标签 - &gt; 其他包含目录
加$(PYTHON_INCLUDE); ...
c)链接器 - &gt; 输出文件
Path-You-Needed \ _ mylib.pyd
d)链接器 - &gt; 启用增量链接
设为否(/ INCREMENTAL:NO)
e)链接器 - &gt; 输入 - &gt; 附加依赖
添加$(PYTHON_LIB); ...
f) C / C ++ - &gt; 预编译标题: 关闭预编译的头文件,设置** Not Using Precompiled Headers *并在
之后删除stdafx文件 g)常规标签。只需检查这些是否已设定:
配置类型=动态库(.dll)
字符集=使用Unicode字符集
公共语言运行时支持=没有公共语言运行时支持
它编译。</ p>
P.S。并且不要忘记在系统中设置%PYTHON_INCLUDE%和%PYTHON_LIB%变量。
答案 1 :(得分:0)
ou_thread.h中似乎缺少一些#include。
此外,“'类'类型重新定义”可能表示您没有类似
的内容#ifndef __ou_thread_h__
#define __ou_thread_h__
// your stuff, classes, etc.
#endif
在你的ou_thread.h中
这是猜测...