2012-06-28 21 views
8

Mi CMake es algo así comoctypes no encontrar símbolos en la biblioteca compartida creada usando la configuración para crear una librería compartida en Linux CMake

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 'addTwoNumber 'función con 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)) 

Me está llegando un mensaje como.

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

he comprobado la libUTILS.so usando el comando "nm --demangle libUTILS.so" y muestra claramente el símbolo 'addTwoNumber' en ella.

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

Respuesta

15

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 está pasando aquí, es que los nombres están siendo destrozados por el compilador g ++, hice que funciona 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 

de salida:

$ python test.py 
5.8 

nota la palabra clave extern esto hace que el compilador no mangle el nombre, hay que hacer algunas cosas extra cuando debajo de las ventanas, que se encontró que era http://wolfprojects.altervista.org/dllforpyinc.php tipo de interesante.

Espero que esto ayude.

mi máquina:

$ g ++ --version
i686-manzana-darwin10-g ++ - 4.2.1 (GCC) 4.2.1 (Apple Inc. construir 5666) (punto 3) Derechos de Autor (C) 2007 Free Software Foundation, Inc. Este es un software gratuito; ver la fuente de las condiciones de copia. No hay garantía de ; 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 jun 16:33:36 PDT 2011; raíz: xnu-1504.15.3 ~ 1/RELEASE_I386 i386

+2

Gracias por esto. Estaba enfrentando el mismo problema, resulta que simplemente necesitaba 'externar' C '' todas mis funciones (como también se menciona en la documentación de Python en [Extendiendo Python con la sección C o C++] (http: // docs. python.org/2/extendiendo/extendiendo.html#writing-extensions-in-c)). – Breakthrough

Cuestiones relacionadas