我想在Python程序中對C++函數名稱進行修改和取消處理。 有沒有類似的東西可用?我現在搜索了幾個小時,也許我在這裏很幸運......C++名稱用於Python的Mangling庫
回答
你很可能不希望在Python中這樣做。另外,你可能不應該從你的DLL中導出重名的名字,因爲它使得使用不同編譯器的人很難使用它。
如果您必須使用重名的名稱,那麼只需在您的Python代碼中對其進行硬編碼。如果您打算在Python代碼中進行修改,那麼您必須:
- 瞭解有關編譯器的實現特定規則。
- 在Python中指定每個函數的C++函數簽名。
對我來說,在Python中對所有這些代碼進行編碼似乎不太可能比對簡單名稱進行硬編碼更好。
謝謝,我剛加了'extern「C」',現在函數名看起來很好! – manuels
@manuels優秀!從DLL或共享對象導出重名的名稱會導致很多問題,我同意'extern「C」'是解決方案。 –
如果您想取消名稱,例如。用於顯示,那麼你可以創建一個運行C++ filt的管道。
def demangle(names):
args = ['c++filt']
args.extend(names)
pipe = subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
stdout, _ = pipe.communicate()
demangled = stdout.split("\n")
# Each line ends with a newline, so the final entry of the split output
# will always be ''.
assert len(demangled) == len(names)+1
return demangled[:-1]
print demangle(['_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE17_M_stringbuf_initESt13_Ios_Openmode',
'_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE6setbufEPci'])
如果您需要使用特定的demangling方法,則可以爲C++ filt指定參數。
處理名稱要困難得多,如果不知道所涉及類型的定義,可能無法完成。
哪些編譯器支持C++ filt? –
@David:[查看文檔](http://sourceware.org/binutils/docs-2.16/binutils/c_002b_002bfilt.html)用於'-s'或'--format'選項。 –
至少使用較新的python,你需要在使用stdout.decode()之前執行split() – mcsim
- 1. 動態庫在C++名稱中使用靜態庫mangling error
- 2. 名稱mangling和dumpbin
- 3. g ++模板名稱mangling
- 4. 打印C++名字mangling
- 5. Python的「私人」名稱mangling和實例與類的屬性
- 6. 當我嘗試使用異常時獲取名稱mangling [CodeBlocks,C++]
- 7. 在__init__中的python名稱mangling似乎不一致
- 8. 「mangling」xml beans類的名稱空間/包名稱
- 9. 如何防止在Cocoa框架中C++名稱mangling
- 10. 如何阻止GNU GCC從mangling dll導入函數名稱
- 11. 在Python中更改庫的名稱
- 12. ddins動詞在J ODBC庫mangling SQL表名?
- 13. Python:基於變量的名稱實例
- 14. 用於python/java/c的OCSP庫?
- 15. 用於UDT C++庫的Python包裝器
- 16. 用於python的C++庫 - 鏈接問題
- 17. 基於名稱的C#顯示組件
- 18. 關於C++名稱查詢的澄清
- 19. SIP SDP mangling
- 20. DLL和Name Mangling
- 21. Google Maps mangling KML
- 22. Openshift 302 mangling
- 23. Waf:爲python擴展指定庫名稱
- 24. 的Python ConfigParser名稱
- 25. 的Python:按名稱
- 26. 引用python包名稱而不用硬編碼它的名稱
- 27. cegcc:使用vC++(mangling issue)編譯失敗的鏈接導入庫
- 28. JavaScript中用於使用名稱空間解析XML的庫?
- 29. 流星客戶端JavaScript縮小和mearging,但沒有mangling變量名稱
- 30. C++ DLL \靜態庫名稱問題
名稱修改是特定於實現的。你對哪個編譯器感興趣? –
mangle/demangle是什麼意思? –