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