2012-06-28 8 views
8

मेरे CMake का उपयोग कर बनाई गई है जैसेctypes साझा लाइब्रेरी में प्रतीकों नहीं मिल linux में एक साझा lib बनाने के लिए की स्थापना CMake

SET (CMAKE_CXX_FLAGS "-fPIC") 

SET (LIB_UTILS_SRC 
    Utils.cpp 
) 

ADD_LIBRARY (UTILS SHARED 
    ${LIB_UTILS_SRC} 
) 

स्रोत Utils.cpp

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

जब उपयोग करने के लिए 'कोशिश कर addTwoNumber कुछ '

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)) 

मुझे कुछ संदेश मिल रहा है जैसे सीटीपीप्स का उपयोग करना।

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

मैं "एनएम --demangle libUTILS.so" आदेश का उपयोग libUTILS.so की जाँच की और यह स्पष्ट रूप से उस में 'addTwoNumber' प्रतीक को दर्शाता है।

मुझे अभी भी पायथन से "अनिर्धारित प्रतीक" संदेश क्यों मिल रहा है? मुझे लगता है कि सेट करने के लिए कुछ कंपाइलर झंडे होना चाहिए ताकि प्रतीक ठीक से उलझ जाए। किसी भी सुझाव का स्वागत है !

उत्तर

15

दिलचस्प, मैं आमतौर पर numpy.ctypes का उपयोग के बाद से मैं लगातार बड़े डेटा सेट के साथ सौदा है, और कभी किसी भी मुद्दे था, लेकिन मुझे लगता है कि मैं जानता हूँ कि क्या यहाँ पर जा रहा है, यह है कि नाम जी ++ संकलक द्वारा विकृत किया जा रहा है, मैं बना

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 

उत्पादन:

$ python test.py 
5.8 

टिप्पणी extern कीवर्ड इस यकीन है कि संकलक नाम वध नहीं करता है, आप जब खिड़कियों के तहत कुछ अतिरिक्त सामान क्या करना है, मैं मिला http://wolfprojects.altervista.org/dllforpyinc.php तरह का था जो दिलचस्प।

मुझे उम्मीद है कि इससे मदद मिलती है।

मेरी मशीन:

$ जी ++ --version
i686-सेब के darwin10-जी ++ - 4.2.1 (जीसीसी) 4.2.1 (एप्पल इंक 5666 का निर्माण) (डॉट 3) कॉपीराइट (सी) 2007 फ्री सॉफ्टवेयर फाउंडेशन, इंक यह मुफ्त सॉफ्टवेयर है; शर्तों की प्रतिलिपि बनाने के लिए स्रोत देखें। कोई वारंटी नहीं है; किसी विशेष उद्देश्य के लिए व्यापारिकता या फिटनेस के लिए भी नहीं।

$ uname -a
डार्विन मैकबुकप्रो 10.8.0 डार्विन कर्नेल संस्करण 10.8.0: मंगल जून 16 16:33:36 पीडीटी 2011; रूट: xnu-1504.15.3 ~ 1/RELEASE_I386 i386

+2

इसके लिए धन्यवाद। मुझे एक ही समस्या का सामना करना पड़ रहा था - यह पता चला कि मुझे बस अपने सभी कार्यों को 'बाहरी' सी '' की आवश्यकता है (जैसा कि [सी/सी ++ अनुभाग के साथ विस्तारित पायथन] में पाइथन दस्तावेज में भी उल्लेख किया गया है (http: // docs। python.org/2/extending/extending.html#writing-extensions-in-c))। – Breakthrough

संबंधित मुद्दे