在编译时全局应用extern C.

时间:2017-08-01 18:09:18

标签: python c++ c ctypes

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

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

谢谢

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

3 个答案:

答案 0 :(得分:3)

查看代码,您的问题没有简单的解决方案。该包没有已发布的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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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

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

}