使用boost::python的链接出错

博主分享了解决Python与Boost库兼容性问题的过程。主要问题是64位Python与32位项目的兼容性,通过更换成32位Python解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

   被这个东西折磨了一个晚上,先是听度娘海扯胡诌,发现各种不靠谱。就自己研究,在几乎要放弃时解决了问题。

   首先是调试库的问题。因为网上下下来的安装版python是没有调试库的,所以调试编不过。居然还有人说直接把.lib改个名就变成调试库了。我去了,这么巧?函数地址都一样??不知编过的兄弟用的是哪个版本。我的是python3.3,这个版本肯定不行。就采用猥琐的办法吧:

#ifdef _DEBUG
 #undef _DEBUG
 #include <boost/python.hpp>
#else
 #include <boost/python.hpp>
#endif

   这样调试库的问题就pass了,接下来当我检查了无数遍。发现接口函数还是没实现。一共就两个库,搞毛线啊。不过我这情况稍微复杂一些,vs2008、vs2012、python2.7、python3.3、boost1.53都有。首先我先把boost那边的编译库研究一通,发现都已经生成了。如果你曾经加载到vs2008项目中进行编译,这些库都有了,不用bjam的,虽然这是我过了很久才意识到。不过库的名字不太对,在前面多了个lib,在/stage文件夹中,改过来就行。当然我用源码引入项目的方式,以及各种方式重新生成了一遍库,还是不行。我开始担心会不会由于2.7和3.3改了不少,接口有变化。最后发现....都不是。因为我不使用boost一样不行! 汗了...


    当确定跟这个boost库没关系之后,我又把目标放到python33.lib这个库上了。去掉所有不可能的,剩下的不管多不可能,都是真相。这话是谁说的,真TM有哲理,我想到了一个也仅剩的一个可能,这个库有问题。官方库也出错?我就上官网去算账去了。最后,一个猥琐的细节引起了我的注意。我机器是64位的。所以我的python装的也是64位的,但是项目是32位的,所以用32位的寻址连接64位的静态库,这不找死呢。我赶紧下了个32位的覆盖安装了,果然...就没问题了。


     坑我一晚上,写个博客祭奠一下我为此无谓浪费的脑细胞,为他们立此墓碑,警醒后人... 


本篇博客出自阿修罗道,转载请注明出处:http://blog.csdn.net/fansongy/article/details/9108083



### 解决 Simulink 中 S-Function `Boost_M` 运行仿真的报错问题 当遇到 `Output returned by S-function 'Boost_M' in 'xxx' during flag=3 call must be a real vector of length 2` 的错误提示时,这表明在调用标志为3的情况下,函数返回的结果不符合预期的要求。具体来说,在此情况下应返回长度为2的实际向量。 #### 错误原因分析 该类错误通常发生在以下几个方面: 1. **输出维度不匹配**:S-Function 需要严格遵循定义好的接口协议来设置输入输出参数的数量和类型。如果实际编写的代码未能满足这些条件,则会触发此类警告或异常终止模拟过程[^1]。 2. **状态变量处理不当**:有时由于算法逻辑上的缺陷或者边界情况未被充分考虑(比如除零操作、取平方根运算),可能会使得某些本应保持正值的状态变为负值从而导致计算结果溢出到复数域内,进而违反了实数值约束[^4]。 为了修正这个问题,可以采取如下措施之一: - 检查并调整源码中的输出数组大小声明语句; - 对可能产生越界访问的数据结构实施保护机制; - 审核所有涉及数学变换的地方确保其合理性; 下面给出一段 Python 伪代码用于说明如何正确配置输出尺寸以及初始化必要的成员属性: ```python def mdlInitializeSizes(S): # 设置工作空间中所需存储单元数目 ssSetNumSFcnParams(S, 0) # 初始化连续时间状态数量 if not mxIsEmpty(ssGetSFcnParam(S, 0)): n = int(mxGetPr(ssGetSFcnParam(S, 0))[0]) ssSetNumContStates(S, n) # 设定离散事件计数器增量步长 ssSetNumSampleTimes(S, 1) # 明确指定对外部端口连接关系及数据流向 ssSetInputPortWidth(S, 0, DYNAMICALLY_SIZED) ssSetOutputPortWidth(S, 0, 2) # 输出宽度设为2 ... ``` 此外还需注意的是,在编写 C 或者 MATLAB 文件形式的 S 函数时也要相应地设定好各个阶段的任务完成方式,特别是对于那些依赖于特定上下文环境才能正常运作的功能模块更要小心谨慎对待。 最后提醒一点就是务必仔细阅读官方文档所提供的指导方针——即《Level-2 Matlab S-Function Write Level-2 MATLAB S-Functions》[^3],里面包含了大量有关最佳实践和技术细节方面的宝贵资料可以帮助开发者更好地理解和运用这一强大工具集。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值