Python中文
首页
教程
问答
标签
搜索
登录
注册
使用Cython显示静态链接的clibrary符号
回答此问题可获得
20
贡献值,回答如果被采纳可获得
50
分。
<p>我有一个关于如何在Cython中使用本地C库中的代码的最佳实践的问题。为了避免设置<code>LD_LIBRARY_PATH</code>(或者在/usr/lib或类似目录中安装C库),我认为静态链接是适合我的用例的解决方案。在</p> <p>然而,连接静态链接的c函数是非常重要的。我能<code>cimport</code>另一个cython模块中静态链接C代码的唯一方法是用cython函数指针解释所有导出的函数(请参见<a href="https://github.com/HolgerPeters/cython-example/blob/master/cython-project/c_with_ptrs.pyx" rel="nofollow">https://github.com/HolgerPeters/cython-example/blob/master/cython-project/c_with_ptrs.pyx</a>和<a href="https://github.com/HolgerPeters/cython-example/blob/master/cython-project/c_with_ptrs.pxd" rel="nofollow">https://github.com/HolgerPeters/cython-example/blob/master/cython-project/c_with_ptrs.pxd</a>)</p> <p>仅仅将pxd中的原始C函数声明为extern似乎不起作用。我在Github上有一个示例项目,它隔离了不同的方法及其用法。在</p> <p><a href="https://github.com/HolgerPeters/cython-example" rel="nofollow">https://github.com/HolgerPeters/cython-example</a></p> <p>有什么想法吗?我可以告诉Cython显式使用<code>extern</code>ed声明吗?在</p> <h2>特定堆栈跟踪</h2> <p>由于这个问题一开始是一个相当开放的问题,我想更具体地鼓励大家回答。在</p> <p>在命名的github项目中,我组装了几种链接方式。我现在将重点介绍文档中看起来很自然的方式。在</p> <p><a href="https://github.com/HolgerPeters/cython-example/blob/master/cython-project/c_from_with_direct_compilation.pxd" rel="nofollow">https://github.com/HolgerPeters/cython-example/blob/master/cython-project/c_from_with_direct_compilation.pxd</a></p> <pre> cdef extern from "foo.h": extern int clib_return_3(int) </pre> <p>以及相应的 <a href="https://github.com/HolgerPeters/cython-example/blob/master/cython-project/c_from_with_direct_compilation.pyx" rel="nofollow">https://github.com/HolgerPeters/cython-example/blob/master/cython-project/c_from_with_direct_compilation.pyx</a></p> ^{pr2}$ <p>使用直接从_调用c__编译.useit()工程(测试.sh输出如下)。在</p> <p>但是当我试图从另一个cython文件使用<code>clib_return_3</code>时,它失败了!用法是</p> <p>{a6}</p> <pre> cimport c_from def useit(): print(c_from.clib_return_3(4)) </pre> <p><code>bash test.sh</code>测试所有的使用情况,如您所见,cython因此clib_return_3符号链接到的地方确实可以使用该符号,而另一个尝试导入该符号的cython则在这一点上失败了。在</p> <pre> ======================== c_from_w/_direct_comp, interfacing fails (why?) Invoke from statically linked c_from_with_direct_compilation, invocation by c_from_with_direct_compilation_user Traceback (most recent call last): File "", line 1, in ImportError: ./c_from_with_direct_compilation_user.so: undefined symbol: clib_return_3 FAILURE ======================== c_from_w/_direct_comp Invoke from statically linked c_from_with_direct_compilation 3 SUCCESS </pre>
0 条评论
分类:
Python问答
请先
登录
后评论
默认排序
时间排序
1 个回答
匿名
1天前
擅长:python、mysql、java
<p>在对这个问题进行了足够长时间的研究之后,我想我知道发生了什么:</p> <p>Cython cdef函数是名称损坏的,而外部函数不是名称损坏的,而是保留其原始名称。为了在不同模块之间发现函数,需要对名称进行修改。因此,不能通过<code>cimport</code>共享未损坏的名称-对于这些名称,应用普通的C共享库机制。在</p>
请先
登录
后评论
针对此问题:
更多的回答
关注
89
关注
收藏
1
收藏,
216
浏览
网友 提问于 2天前
相关Python问题
如何在乒乓球比赛中预测球的轨迹,对于AI球拍预测?
5 回答
如何在乒乓球游戏中阻止球
2 回答
如何在乘法和模中不乘空间?
3 回答
如何在乘法和除以2个不同的数字之间进行交换?
10 回答
如何在也是数据一部分的单个字符上拆分大字符串
2 回答
如何在乾草堆中找到針,有更好的解決方案嗎?
7 回答
如何在事件wxWidgets中传递自定义数据
2 回答
如何在事件中使用lambda i=i?
5 回答
如何在事件中心只接收最近的数据
8 回答
如何在事件发生之前保持云函数运行?
5 回答
如何在事件发生后使页面重定向到同一页面
7 回答
如何在事件回调之间保持python生成器的状态
9 回答
如何在事件处理程序(pythonsocket、sphinx)中保留docstring
9 回答
如何在事件处理程序中更改wxRichTextCtrl的光标位置?
5 回答
如何在事件处理程序中访问外部对象?
8 回答
如何在事件循环中将协程打包为正常函数?
8 回答
如何在事件循环之外运行协同程序?
8 回答
如何在事件循环结束时为并发未来的所有线程调用类方法?
10 回答
如何在事件文件中只保留一份摘要?
7 回答
如何在事件模板中添加事件
1 回答