2017-08-01 77 views
2

我从这里得到了一些代码:https://github.com/Esri/file-geodatabase-api,我想阻止C++名称变形,所以我可以在Python中使用ctypes来调用此DLL。在编译时全局应用extern C

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

谢谢

(PS我不是一个C++开发者,所以借口缺乏适当的术语)

+1

不能老是EXTERN “C”'even * be *应用?一个重载函数将打破任何尝试。 – StoryTeller

+0

请勿使用ctypes。使用C++感知包装器(CLIF,SIP,SWIG等) – Mike

回答

3

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

你不能只是包装的东西在全球extern "C"创建一个C绑定,类型和API都严重C++面向和DLL已反正错位C++符号。

您没有库的源代码,但可以创建一个单独的库,其中包含C可调用函数,该函数又调用原始DLL的C++ API。至少可以说,这不是一件小事!

如果你的目标是获得一个Python为ESRI文件地理数据库API绑定,可以看看这些页面:

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

+0

谢谢你的建议,我想我会尝试这3种解决方案。我试图遵循code.google.com解决方案(swig解决方案),但我无法获得SWIG使用windows创建一个可用的活页夹任何想法? –

1

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

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

这是一个普遍的想法,但不适用于OP的问题。下载软件包并浏览头文件...准备好。 – chqrlie

+0

啊!我刚刚做到了。噢亲爱的。因此,除非有人知道某种工具,否则整个新的适应层。我知道没有:( – systemcpro

0

我将创建与库接口功能的新的头文件,因为不同的操作系统需要不同的功能属性导出:

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

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

}