2017-08-01 71 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; 
} 

}