Me gustaría manipular y exigir nombres de funciones C++ en un programa Python. ¿Hay algo así disponible? Busqué durante horas ahora, tal vez tengo suerte aquí ...C++ Nombre Mangling Library para Python
Respuesta
Lo más probable es que no desee estar haciendo esto en Python. Como comentario aparte, probablemente no deberías estar exportando nombres mutilados de tus archivos DLL, ya que hace que sea difícil de usar para cualquier persona con un compilador diferente.
Si tiene que usar nombres mutilados, simplemente codifíquelos en su código de Python. Si fuera a manipular el código de Python, tendría que:
- Conozca las reglas específicas de implementación para el compilador en cuestión.
- Especifique en Python la firma de la función C++ para cada función.
Me parece muy poco probable que codificar todo esto en Python sea mejor que simplemente codificar los nombres destrozados.
Gracias, acabo de agregar 'extern" C "' y ahora el nombre de la función se ve bien! – manuels
@manuels ¡Excelente! La exportación de nombres mutilados de un archivo DLL o un objeto compartido causa muchos problemas y estoy de acuerdo en que 'extern' C "' es la solución. –
Si desea exigir nombres, p. Ej. para su visualización, puede crear un conducto que ejecute 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'])
Puede especificar argumentos para C++ filt si necesita utilizar un método de demanda específico.
Hacer un nombre es mucho más difícil, y probablemente no se pueda hacer sin conocer las definiciones de los tipos involucrados.
¿Qué compiladores admite C++ filt? –
@David: [Consulte los documentos] (http://sourceware.org/binutils/docs-2.16/binutils/c_002b_002bfilt.html) para la opción '-s' o' --format'. –
Al menos con el python más nuevo, necesitas usar stdout.decode() antes de dividir() – mcsim
- 1. C++ nombre mangling a mano
- 2. Torrent Library para C++, Windows
- 3. nombre stdcall mangling usando c extern y dllexport vs definiciones del módulo (msvC++)
- 4. Python Core Library y PEP8
- 5. Python Music Library?
- 6. pcap python library?
- 7. Secure Python Markdown Library
- 8. python-nose: assertion library?
- 9. C# y C++ Library
- 10. C++ mp3 library
- 11. Python server side AJAX library?
- 12. Game Programming Library C++
- 13. C# library en iOS
- 14. C# AI Library
- 15. SFTP C++ library?
- 16. C# /. NET scripting library
- 17. C# Audio Library
- 18. C# Game Network Library
- 19. C# SIP Stack/Library
- 20. C++ Graphic Drawing Library
- 21. Lightweight C++ Gui Library
- 22. C# Telnet Library
- 23. scrypt C library
- 24. authorize.net C# wrappers/library
- 25. C library vs WinApi
- 26. C# graph drawing library?
- 27. Boost C++ library install
- 28. C# Video Converter library
- 29. Objective-C/iPhone IRC Library
- 30. Fast Cross-Platform C/C++ Hashing Library
El cambio de nombre es específico de la implementación. ¿En qué compilador estás interesado? –
¿qué quieres decir con mangle/demangle? –