【问题标题】:Globally Apply extern C when compiling编译时全局应用 extern C
【发布时间】:2017-08-01 18:09:17
【问题描述】:

我有一些从这里得到的代码:https://github.com/Esri/file-geodatabase-api,我想防止 c++ 名称被修改,以便我可以在 Python 中使用 ctypes 来调用这个 DLL。

有没有办法在编译器级别全局应用 extern "C"? 有没有办法轻松将其应用到代码中的 .h 文件中?

谢谢

(PS 我不是 C++ 开发人员,所以请原谅缺乏适当的术语)

【问题讨论】:

  • extern "C" 甚至可以被申请吗?一个重载的函数会破坏任何尝试。
  • 不要使用 ctypes。使用支持 C++ 的包装器(CLIF、SIP、SWIG 等)

标签: python c++ c ctypes


【解决方案1】:

查看代码,您的问题没有简单的解决方案。该包没有发布的 C 绑定,只有 C++。

您不能只将事物包装在全局 extern "C" 中以创建 C 绑定,类型和 API 很大程度上是面向 C++ 的,而且 DLL 无论如何都会损坏 C++ 符号。

您没有该库的源代码,但您可以创建一个带有 C 可调用函数的单独库,这些函数依次调用原始 DLL 的 C++ API。至少可以说,这是一项不平凡的工作!

如果您的目标是为 ESRI File GeoDatabase API 获取 Python 绑定,您可以查看以下页面:

http://libjoe.blogspot.fr/2014/02/python-wrapper-for-esri-file.html

https://code.google.com/archive/p/file-geodatabase-api-python-wrapper/

https://gis.stackexchange.com/questions/64864/gdal-python-bindings-and-file-geodatabase-api

【讨论】:

  • 感谢您的建议,我想我会尝试这 3 个解决方案。我尝试遵循 code.google.com 解决方案(swig 解决方案),但我无法让 SWIG 使用 windows 创建一个可行的活页夹。有什么想法吗?
【解决方案2】:

在您的 C++ 文件中执行以下操作,这样您就不必更改 headerfile.h:

extern "C" {
#include <headerfile.h>
}

【讨论】:

  • 这是一个普遍的想法,但不适用于OP的问题。下载包并查看头文件...做好准备。
  • 啊!我就是这么做的。哦亲爱的。所以一个全新的适应层,除非有人知道有一些工具。我不知道:(
【解决方案3】:

我会用库接口函数创建一个新的头文件,因为不同的操作系统需要不同的函数导出属性:

extern "C" {
int __attribute__ (dllexport) ReturnSameValue(int avalue) // Linux
{
    return avalue
}

int __declspec(dllexport) IncreseInteger(int avalue) // Windows dll
{
    return avalue+1;
}

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    相关资源
    最近更新 更多