2012-06-28 48 views
8

My CMake thiết để tạo ra một lib chia sẻ trong linux là một cái gì đó giống nhưctypes không tìm thấy biểu tượng trong thư viện chia sẻ tạo bằng CMake

SET (CMAKE_CXX_FLAGS "-fPIC") 

SET (LIB_UTILS_SRC 
    Utils.cpp 
) 

ADD_LIBRARY (UTILS SHARED 
    ${LIB_UTILS_SRC} 
) 

Nguồn Utils.cpp

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

Khi cố gắng truy cập 'addTwoNumber 'chức năng sử dụng CTypes như

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

Tôi nhận được một số thông báo như thế nào.

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

Tôi đã kiểm tra libUTILS.so bằng cách sử dụng lệnh "nm --demangle libUTILS.so" và hiển thị rõ ràng biểu tượng 'addTwoNumber' trong đó.

Tại sao tôi vẫn nhận được thông báo "biểu tượng không xác định" từ python? Tôi đoán rằng phải có một số cờ trình biên dịch được thiết lập sao cho các biểu tượng bị xáo trộn đúng cách. Bất kỳ đề nghị sẽ được đánh giá cao !

Trả lời

15

Thú vị, tôi thường sử dụng numpy.ctypes vì tôi liên tục phải đối phó với các tập dữ liệu lớn và không bao giờ gặp bất kỳ vấn đề nào nhưng tôi nghĩ rằng tôi biết điều gì đang diễn ra ở đây, đó là tên đang bị trình biên dịch g ++ làm nó hoạt động theo cách này:

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 

đầu ra:

$ python test.py 
5.8 

lưu ý từ khóa extern này đảm bảo trình biên dịch không mangle tên, bạn phải làm một số công cụ bổ sung khi dưới cửa sổ, tôi đã tìm thấy http://wolfprojects.altervista.org/dllforpyinc.php đó là loại hấp dẫn.

Tôi hy vọng điều này sẽ hữu ích.

máy của tôi:

$ g ++ --version
i686-apple-darwin10-g ++ - 4.2.1 (GCC) 4.2.1 (Apple Inc xây dựng 5666) (dot 3) Bản quyền (C) 2007 Free Software Foundation, Inc. Đây là phần mềm miễn phí; xem nguồn để sao chép các điều kiện. Có NO bảo hành; thậm chí không cho khả năng bán hàng hoặc PHÙ HỢP CHO MỘT MỤC ĐÍCH CỤ THỂ.

$ uname -a
Darwin MacBookPro 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun 7 16:33:36 PDT 2011; root: xnu-1504.15.3 ~ 1/RELEASE_I386 i386

+2

Cảm ơn vì điều này. Tôi đã phải đối mặt với cùng một vấn đề - hóa ra tôi chỉ cần 'extern 'C'' tất cả các hàm của tôi (như cũng được đề cập trong tài liệu Python trong phần [Mở rộng Python với C hoặc C++] (http: // docs. python.org/2/extending/extending.html#writing-extensions-in-c)). – Breakthrough

Các vấn đề liên quan