studio ndk c++ python c cmake ctypes

c++ - studio - android ndk location



Códigos que no encuentran símbolos en la biblioteca compartida creada con CMake (1)

Mi configuración CMake para crear una lib compartida en Linux es algo así como

SET (CMAKE_CXX_FLAGS "-fPIC") SET (LIB_UTILS_SRC Utils.cpp ) ADD_LIBRARY (UTILS SHARED ${LIB_UTILS_SRC} )

Fuente Utils.cpp

double addTwoNumber(double x, double y) { return x + y; }

Al intentar acceder a la función ''addTwoNumber'' usando CTypes como

import os import ctypes as c libPath = ''/home/AP/workspace/LearningCPP/lib/libUTILS.so'' libUTILS = c.cdll.LoadLibrary(libPath) prototype = c.CFUNCTYPE( c.c_double, c.c_double, c.c_double ) addTwoNumber = prototype((''addTwoNumber'', libUTILS)) res = addTwoNumber(c.c_double(2.3), c.c_double(3.5) )

Estoy recibiendo un mensaje como.

AttributeError: /home/AP/workspace/LearningCPP/lib/libUTILS.so: undefined symbol: addTwoNumber

Comprobé libUTILS.so utilizando el comando "nm --demangle libUTILS.so" y muestra claramente el símbolo ''addTwoNumber'' en él.

¿Por qué sigo recibiendo el mensaje "símbolo indefinido" de pitón? Supongo que debe haber algunos indicadores del compilador configurados para que los símbolos se procesen correctamente. ¡Cualquier sugerencia sería apreciada!


Interesante, suelo usar numpy.ctypes ya que constantemente tengo que lidiar con grandes conjuntos de datos, y nunca tuve problemas, pero creo que sé lo que sucede aquí, es que los nombres están siendo destrozados por el compilador g ++, lo hice funcionar de esta manera:

Makefile:

g++ -Wall -fPIC -O2 -c Utils.cpp g++ -shared -Wl -o libUTILS.so Utils.o

Utils.cpp

extern "C" double addTwoNumber(double x, double y) { return x + y; }

test.py

import os import ctypes as c libUTILS = c.cdll.LoadLibrary(''libUTILS.so'') prototype = c.CFUNCTYPE( c.c_double, c.c_double, c.c_double ) addTwoNumber = prototype((''addTwoNumber'', libUTILS)) res = addTwoNumber(c.c_double(2.3), c.c_double(3.5) ) print res

salida:

$ python test.py 5.8

tenga en cuenta la palabra clave extern esto asegura que el compilador no destruya el nombre, tiene que hacer algunas cosas adicionales cuando en Windows, encontré http://wolfprojects.altervista.org/dllforpyinc.php, que fue algo interesante.

Espero que esto ayude.

mi máquina:

$ g ++ --version
i686-apple-darwin10-g ++ - 4.2.1 (GCC) 4.2.1 (Apple Inc. compilación 5666) (punto 3) Copyright (C) 2007 Free Software Foundation, Inc. Este es software libre; ver la fuente de las condiciones de copia. NO hay garantía; ni siquiera para COMERCIABILIDAD o IDONEIDAD PARA UN PROPÓSITO PARTICULAR.

$ uname -a
Darwin MacBookPro 10.8.0 Darwin Kernel Versión 10.8.0: Mar 7 de junio 16:33:36 PDT 2011; raíz: xnu-1504.15.3 ~ 1 / RELEASE_I386 i386