在Python中公开C++全局变量

2024-07-02 14:08:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用Python代码使用Cython访问C++全局变量。在

我们假设C++代码中有以下数组:

// Project.cpp
int myArr[2] = { 0, 1 };

因此,在Cython中定义指向myArr的指针:

^{pr2}$ <>强> MyARYPPTR <强>真的指向C++数组吗?或者只是一个随机值?在


Tags: 代码project定义数组cppcythonint指向
1条回答
网友
1楼 · 发布于 2024-07-02 14:08:15

好吧,问题是:

Project.cpp有一个全局的int *myArr;,它没有在Project.h中列出,您想从Cython访问它而不导入Project.cpp。在

在评论中,你说:

I can't include Project.cpp because this file will try to include other files that were already included and will try to redefine many variables.

按照你描述的方式,这里可能有一个基本错误。你可能知道这些基本的事情,所以请不要因为我把它们提出来而受辱,但我只想说得透彻:

首先,如果您的头文件没有防止多个包含的防护措施,请解决这个问题,然后您就不必担心“我不能包括Project.cpp”,因为这个文件将尝试包含其他已包含的文件,并将尝试重新定义许多变量。”(如果您没有头文件,而您只是在.cpp中执行所有操作文件中有明确的^ {< CD6>}语句,不要这样做,这是一个坏主意,在C和C++中,在你进行CythOn化之前。

第二,如果您的模块要接口到Project.cpp所属的.so/.dll/.dylib,则不应针对该库的源代码进行构建,而是针对已安装的接口。另一方面,如果你的模块直接包含C++代码,那么你的已经有了EEM>,包括^ {CD1}}。如果您使用extern声明来引用您不打算链接到的内容,那么您只会得到一个链接器错误,或者,如果您运气不好,所有内容都将生成,但在运行时失败。在

第三,如果它实际上不是全局的,那么您就不能从Project.cpp之外进行访问-由于范围、生存期或链接的原因,在单独的实现文件中没有其他类型的变量可用。在

再一次,我假设你知道所有这些基本的事情,我只是误读了你的评论。这是一个真正的问题,你需要用一个设计糟糕的API来包装一些东西,这个API要求你深入到内部,这有时会很棘手,你可能遇到过这样的事情,我只是不知道具体怎么做。在

有三种基本解决方案。在

首先,显然,如果您可以构建一个合适的本地API,那么用Cython包装API是很简单的。同时,由于其他原因,这也是有用的。有时,这会花费太多的时间和精力—例如,如果本机库不是为外部驱动而设计的,并且是一个需要花费10年时间进行遗留维护的大量工作的话,那么您可能不想清理它。或者,如果它是一个快速变化的库,您需要保持最新,并且没有源代码控制,那么分割它并尝试保持同步可能是一场噩梦。等等。但如果你没有这样的理由,这是正确的答案。如果你能cdef extern from "project.h",一切都很简单。在

您可以通过在本机级别创建一个“shimapi”,为需要从内部使用的各种、函数和类型创建单独的.h文件,其中包含相应的外部、函数和类型声明。然后,你就可以cdef extern from "project_extras.h"。在

最后,您总是可以为任何东西编写显式的cdef extern语句,而不必告诉Cython这些语句来自何处。Cython将在生成的代码中将其转换为适当的本机externs,如果一切都正确,它将起作用。这里有一些缺点-the docs解释一下你将放弃的cdef extern from的所有优点。简而言之,Cython声明必须与本机声明完全匹配;否则,在Cython阶段,您将从C编译器收到一条难以理解的错误消息,它引用了Cython生成的不可读的C代码,而不是实际的代码,或者更糟的是,代码这样做是错误的。在

对于一个简单的int *int []值,所有这些都不重要,因为这不需要任何解释;一个简单的cdef extern应该只是fine

相关问题 更多 >