如何在 VS2010 中 SWIG?

2021-12-14 00:00:00 python swig c++ visual-studio-2010

大家好,我正在尝试将我在 VS2010 (c++) 中创建的多文件项目 SWIG 转换为 python.我设法链接了 Python26.lib 文件,并让 SWIG 为我的主 .cpp 文件生成了一个包装器 .cpp 文件.我已经设置我的代码来构建一个扩展名为 .pyd 的 .dll.

这是我目前拥有的 .i 文件:

%module HiveGPS%{#include "ou_thread.h"#include "HiveGPS.h"%}%include ou_thread.h% 包括 HiveGPS.h

而且我已经设法获得了 .py 和 .pyc 文件.现在,根据我的理解,为了运行我的 .py 文件,我需要将它链接到我的 .pyd 文件,但是当我尝试使用 VS2010 使用上面列出的设置构建我的项目时,它会抱怨我的 Thread 类正在使用:

1>------ 构建开始:项目:HiveGPS,配置:发布 Win32 ------1> 构建于 2011 年 5 月 11 日下午 1:41:30 开始.1>初始化构建状态:1>触摸ReleaseHiveGPS.unsuccessfulbuild".1>Cl编译:1>HiveGPS_wrap.cpp1>c:users*desktophivegpshivegpsou_thread.h(57):错误 C2146:语法错误:缺少;"在标识符m_strName"之前1>c:users*desktophivegpshivegpsou_thread.h(57):错误 C4430:缺少类型说明符 - 假设为 int.注意:C++ 不支持 default-int1>c:users*desktophivegpshivegpsou_thread.h(57):错误 C4430:缺少类型说明符 - 假设为 int.注意:C++ 不支持 default-int1>c:users*desktophivegpshivegpsou_thread.h(64):错误 C2146:语法错误:缺少;"在标识符getName"之前1>c:users*desktophivegpshivegpsou_thread.h(64):错误 C4430:缺少类型说明符 - 假设为 int.注意:C++ 不支持 default-int1>c:users*desktophivegpshivegpsou_thread.h(64):错误 C4430:缺少类型说明符 - 假设为 int.注意:C++ 不支持 default-int1>c:users*desktophivegpshivegpsou_thread.h(64):警告 C4183:'getName':缺少返回类型;假定是一个返回int"的成员函数1>c:users*desktophivegpshivegpsou_thread.h(98):错误 C2146:语法错误:缺少;"在标识符m_strName"之前1>c:users*desktophivegpshivegpsou_thread.h(98):错误 C4430:缺少类型说明符 - 假设为 int.注意:C++ 不支持 default-int1>c:users*desktophivegpshivegpsou_thread.h(98):错误 C4430:缺少类型说明符 - 假设为 int.注意:C++ 不支持 default-int1>c:users*desktophivegpshivegpsou_thread.h(104):错误C2146:语法错误:缺少';'在标识符getName"之前1>c:users*desktophivegpshivegpsou_thread.h(104):错误 C4430:缺少类型说明符 - 假设为 int.注意:C++ 不支持 default-int1>c:users*desktophivegpshivegpsou_thread.h(104):错误 C4430:缺少类型说明符 - 假设为 int.注意:C++ 不支持 default-int1>c:users*desktophivegpshivegpsou_thread.h(104):警告 C4183:'getName':缺少返回类型;假定是一个返回int"的成员函数1>c:users*desktophivegpshivegpsou_thread.h(115):错误C2146:语法错误:缺少';'在标识符 'msg' 之前1>c:users*desktophivegpshivegpsou_thread.h(115):错误 C4430:缺少类型说明符 - 假设为 int.注意:C++ 不支持 default-int1>c:users*desktophivegpshivegpsou_thread.h(115):错误 C4430:缺少类型说明符 - 假设为 int.注意:C++ 不支持 default-int1>c:users*desktophivegpshivegpsou_thread.h(118):错误C2146:语法错误:缺少';'在标识符getMessage"之前1>c:users*desktophivegpshivegpsou_thread.h(118):错误 C4430:缺少类型说明符 - 假设为 int.注意:C++ 不支持 default-int1>c:users*desktophivegpshivegpsou_thread.h(118):错误 C4430:缺少类型说明符 - 假设为 int.注意:C++ 不支持 default-int1>c:users*desktophivegpshivegpsou_thread.h(118):警告 C4183:'getMessage':缺少返回类型;假定是一个返回int"的成员函数1>c:users*desktophivegpshivegpsou_thread.h(51): error C2011: 'openutils::Thread' : 'class' 类型重新定义1>c:users*desktophivegpshivegpsou_thread.h(51) :参见openutils::Thread"的声明1>c:users*desktophivegpshivegpsou_thread.h(93): error C2011: 'openutils::Mutex' : 'class' 类型重新定义1>c:users*desktophivegpshivegpsou_thread.h(93) :参见'openutils::Mutex'的声明1>c:users*desktophivegpshivegpsou_thread.h(113):错误 C2011:'openutils::ThreadException':'class' 类型重新定义1>c:users*desktophivegpshivegpsou_thread.h(113) :参见openutils::ThreadException"的声明1>c:users*desktophivegpshivegpsHiveGPS.h(29):错误 C2504:'openutils::Thread':基类未定义1>c:users*desktophivegpshivegpsHiveGPS.h(53): error C2079: 'HiveGPS::readWriteMutex' 使用未定义的类 'openutils::Mutex'1>HiveGPS_wrap.cpp(3086):错误 C2027:使用未定义类型openutils::Thread"1>c:users*desktophivegpshivegpsou_thread.h(51) :参见openutils::Thread"的声明1>HiveGPS_wrap.cpp(3086):致命错误C1903:无法从之前的错误中恢复;停止编译1>1> 构建失败.1>1> 已用时间 00:00:02.10========== 构建:0 成功,1 失败,0 最新,0 跳过 ==========

所有这些错误(减去最后一个)基本上都是说 String 类是以某种方式实现的,是否与 Python 对 String 类的定义相冲突?最后一个错误是抱怨 Thread 类,这可能是同样的问题吗?

所有这些都说:有人能告诉我我做错了什么吗,或者更好,请指点我如何为 VS2010 执行此操作的教程(SWIG 站点是 2008 年的).

如果不能这样做,我可以将我生成的 .py 文件以某种方式链接到 .dll 文件吗?

抱歉解释太长,但我对这个有点迷茫,所以我决定解释一切.

解决方案

好的,我正在使用 swig 和 VS2010 没有问题...

就您而言,看起来更像是您在链接方面存在问题.除了检查库之外,不要忘记检查您正在链接的 32-64 位库.尝试将所有作为 x86 目标链接为故障安全.并且不要使用AnyCpu.

<小时>

如何在 VS2010 下使用 SWIG.

让我们定义您想要获取 mylib.py,因此您创建了一些 SWIG 接口文件,其中 mylib.i 作为主"文件.我假设您已经有了一个包含 C++ 类的项目解决方案.

(1) 首先为 SWIG 接口创建 C++ 项目.使用应该创建 C++ DLL 存根的 Visual C++-> 类库项目.我把所有的 .i 文件放在那里.并将 Visual Studio 设置为将 .i 高亮显示为 .h - 这很方便.

(1.1) 将 mylib_wrap.cxx 文件添加到项目中(在 swig 尚未生成文件时创建一个空文件)

(2)
a) 在 mylib.i 上按右键,选择属性.
b) 将 ItemType 设置为自定义构建工具".
在自定义构建步骤窗口中:
c) 命令行字段应该是这样的:

echo 为了正常运行,请确保以下环境变量是正确设置:回声 PYTHON_INCLUDE:%PYTHON_INCLUDE%回声 PYTHON_LIB:%PYTHON_LIB%回声C:swigswig.exe -c++ -python %(FullPath)

将 C:swigswig.exe 更改为 SWIG 的路径

d) 在输出字段中:

$(InputName)_wrap.cxx

(3) 转到此项目属性:

a) C++ 选项卡 -> 其他包含目录
添加 $(PYTHON_INCLUDE);...

c) 链接器 -> 输出文件
你需要的路径\_mylib.pyd

d) 链接器 -> 启用增量链接
设置为否 (/INCREMENTAL:NO)

e) 链接器 -> 输入 -> 附加依赖
添加 $(PYTHON_LIB);...

f) C/C++ -> 预编译头:关闭预编译头文件,设置 **Not Using Precompiled Headers* 并在

之后删除 stdafx 文件

g) 常规标签.只需检查是否设置了这些:
配置类型 = 动态库 (.dll)
字符集 = 使用 Unicode 字符集
公共语言运行时支持 = 无公共语言运行时支持

它编译.

附言并且不要忘记在您的系统中设置 %PYTHON_INCLUDE% 和 %PYTHON_LIB% 变量.

Hey Everybody, I'm trying to SWIG a multi file project that I made in VS2010 (c++) to python. I've managed to link the Python26.lib file, and have SWIG generating a wrapper .cpp file for my main .cpp file. I've set my code to build a .dll with the extension .pyd.

This is the .i file I have currently:

%module HiveGPS

%{
#include "ou_thread.h"
#include "HiveGPS.h"
%}


%include ou_thread.h
%include HiveGPS.h

And I've mangaed to get a .py and .pyc file. Now, from my understanding in order to run my .py file, I need to link it to my .pyd file, but when I try to use VS2010 to build my project with the settings I listed above, it complains about a Thread class I'm using:

1>------ Build started: Project: HiveGPS, Configuration: Release Win32 ------
1>Build started 5/11/2011 1:41:30 PM.
1>InitializeBuildStatus:
1>  Touching "ReleaseHiveGPS.unsuccessfulbuild".
1>ClCompile:
1>  HiveGPS_wrap.cpp
1>c:users*desktophivegpshivegpsou_thread.h(57): error C2146: syntax error : missing ';' before identifier 'm_strName'
1>c:users*desktophivegpshivegpsou_thread.h(57): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:users*desktophivegpshivegpsou_thread.h(57): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:users*desktophivegpshivegpsou_thread.h(64): error C2146: syntax error : missing ';' before identifier 'getName'
1>c:users*desktophivegpshivegpsou_thread.h(64): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:users*desktophivegpshivegpsou_thread.h(64): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:users*desktophivegpshivegpsou_thread.h(64): warning C4183: 'getName': missing return type; assumed to be a member function returning 'int'
1>c:users*desktophivegpshivegpsou_thread.h(98): error C2146: syntax error : missing ';' before identifier 'm_strName'
1>c:users*desktophivegpshivegpsou_thread.h(98): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:users*desktophivegpshivegpsou_thread.h(98): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:users*desktophivegpshivegpsou_thread.h(104): error C2146: syntax error : missing ';' before identifier 'getName'
1>c:users*desktophivegpshivegpsou_thread.h(104): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:users*desktophivegpshivegpsou_thread.h(104): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:users*desktophivegpshivegpsou_thread.h(104): warning C4183: 'getName': missing return type; assumed to be a member function returning 'int'
1>c:users*desktophivegpshivegpsou_thread.h(115): error C2146: syntax error : missing ';' before identifier 'msg'
1>c:users*desktophivegpshivegpsou_thread.h(115): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:users*desktophivegpshivegpsou_thread.h(115): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:users*desktophivegpshivegpsou_thread.h(118): error C2146: syntax error : missing ';' before identifier 'getMessage'
1>c:users*desktophivegpshivegpsou_thread.h(118): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:users*desktophivegpshivegpsou_thread.h(118): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:users*desktophivegpshivegpsou_thread.h(118): warning C4183: 'getMessage': missing return type; assumed to be a member function returning 'int'
1>c:users*desktophivegpshivegpsou_thread.h(51): error C2011: 'openutils::Thread' : 'class' type redefinition
1>          c:users*desktophivegpshivegpsou_thread.h(51) : see declaration of 'openutils::Thread'
1>c:users*desktophivegpshivegpsou_thread.h(93): error C2011: 'openutils::Mutex' : 'class' type redefinition
1>          c:users*desktophivegpshivegpsou_thread.h(93) : see declaration of 'openutils::Mutex'
1>c:users*desktophivegpshivegpsou_thread.h(113): error C2011: 'openutils::ThreadException' : 'class' type redefinition
1>          c:users*desktophivegpshivegpsou_thread.h(113) : see declaration of 'openutils::ThreadException'
1>c:users*desktophivegpshivegpsHiveGPS.h(29): error C2504: 'openutils::Thread' : base class undefined
1>c:users*desktophivegpshivegpsHiveGPS.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*desktophivegpshivegpsou_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 ==========

All of these errors (minus the last one) are basically saying that the String class is implemented somehow, is it conflicting with Python's definition of the String class? The last error is complaining about the Thread class, could that be the same problem?

All of that said: Can somebody tell me what I'm doing wrong, or better yet, point me to a tutorial of how to do this for VS2010 (the SWIG site is for 2008).

And if that can't be done, can I link the .py file I have generated to the .dll file somehow?

Sorry for the long explanation but I'm kinda lost on this one so I decided to explain everything.

解决方案

Ok, I'm using swig and VS2010 with no problems...

In your case, it looks more like you have problems with linking. Beyond the check of libraries, dont forget to check 32-64 bit libraries you are linking. Try to link all as x86 target as fail-safe. And don't use AnyCpu.


How to use SWIG under VS2010.

lets define you want to obtain mylib.py, so you created some SWIG interface files with mylib.i as "main" file. I assume that you already have a solution with project with your C++ classes there.

(1) First create C++ project for SWIG interface. Use Visual C++->Class library project which should create a C++ DLL stub. I put all .i files there. And set visual studio to highlight .i as .h - it is handy.

(1.1) Add mylib_wrap.cxx file to the project (create empty file while swig hasn't generated one yet)

(2)
a) Press right button over the mylib.i, choose properties.
b) set ItemType as "Custom build tool".
In custom build step window:
c) Command line field should be something like:

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:swigswig.exe -c++ -python %(FullPath) 

change C:swigswig.exe to your path to SWIG

d) In Outputs field:

$(InputName)_wrap.cxx

(3) Go to this project properties:

a) C++ tab -> Additional Include Directories
add $(PYTHON_INCLUDE); ...

c) Linker -> Output File
Path-You-Needed\_mylib.pyd

d) Linker -> Enable Incremental Linking
set as No (/INCREMENTAL:NO)

e) Linker -> Input -> Additional Dependencies
add $(PYTHON_LIB);...

f) C/C++ -> Precompiled Headers: Switch off precompiled headers, set **Not Using Precompiled Headers* and remove stdafx files after

g) General tab. Just check that these are set:
Configuration type = Dynamic Library (.dll)
Character set = Use Unicode Character Set
Common Language Runtime Support = No Common Language Runtime Support

It compiles.

P.S. And dont forget to set %PYTHON_INCLUDE% and %PYTHON_LIB% variables in your system too.

相关文章