2010-05-07 27 views
9

Tôi đã lấy một thư viện được phân phối dưới dạng nhị phân lib (.a) và tiêu đề, viết một số mã C++ vào nó và muốn kết quả trong một con trăn mô-đun.mở rộng python c, các vấn đề với dlopen trên mac os

Tôi đã thực hiện điều này here.

Vấn đề là khi nhập module này trên Mac OSX (Tôi đã thử 10.5 và 10.6), tôi nhận được lỗi sau:

dlopen(/Library/Python/2.5/site-packages/dirac.so, 2): Symbol not found: _DisposePtr 
    Referenced from: /Library/Python/2.5/site-packages/dirac.so 
    Expected in: dynamic lookup 

này trông giống như những biểu tượng được xác định trong khuôn khổ Carbon không được giải quyết đúng cách, nhưng tôi không chắc chắn phải làm gì về điều đó. Tôi đang cung cấp thông số cho distutil.core.Extension 's extra_link_args, vì vậy tôi không chắc mình nên làm gì khác.

Mọi trợ giúp sẽ được đánh giá cao.

Cập nhật:

Dòng biên dịch được tạo ra bởi setup.py trông như thế này:

gcc -fno-strict-aliasing -Wno-long-double -no-cpp-precomp -mno-fused-madd -fno-common -dynamic -DNDEBUG -g -Os -Wall -Wstrict-prototypes -DMACOSX -I/usr/include/ffi -DENABLE_DTRACE -arch i386 -arch ppc -pipe -Isource -I/System/Library/Frameworks/Python.framework/Versions/2.5/Extras/lib/python/numpy/core/include -I/System/Library/Frameworks/Python.framework/Versions/2.5/Extras/lib/python/numpy/numarray -I/usr/lib/python/2.5/site-packages/numpy/numarray/numpy -I/usr/lib/python/2.5/site-packages/numpy/numarray -I/usr/lib/python/2.5/site-packages/numpy/core/include -I/System/Library/Frameworks/Python.framework/Versions/2.5/include/python2.5 -c source/Dirac_LE.cpp -o build/temp.macosx-10.5-i386-2.5/source/Dirac_LE.o 

Dòng mối liên kết trông như thế này:

g++ -Wl,-F. -bundle -undefined dynamic_lookup -arch i386 -arch ppc build/temp.macosx-10.5-i386-2.5/diracmodule.o build/temp.macosx-10.5-i386-2.5/source/Dirac_LE.o -Llibs/MacOSX -lDiracLE -o build/lib.macosx-10.5-i386-2.5/dirac.so -framework Carbon 

otool báo cáo:

dirac.so: 
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.4.0) 
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0) 
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.5) 

Cập nhật 2: Trên MacOS 10.5, sửa đổi cờ dlopen từ mặc định RTLD_NOW thành RTLD_LAZY giải quyết vấn đề. Tuy nhiên, điều này không hoạt động trên Mac OS 10.6.

On 10,6, trình tự sau đây cho phép thư viện để chạy đúng, mặc dù tôi không chắc chắn lý do tại sao:

  1. python setup.py xây dựng -v
  2. chạy dòng liên kết (in để an ủi bởi setup.py) một lần nữa, theo cách thủ công.
  3. python setup.py cài đặt

Tôi vẫn đang tìm kiếm một câu trả lời tốt như thế nào để có được điều này để làm việc đúng cách. Cảm ơn!

+1

trình biên dịch thực tế là gì dòng lệnh setup.py thực thi? Xóa thư mục 'build' và chạy' setup.py build -v' để xem. Ngoài ra, 'otool -L' nói gì về tệp' dirac.so'? –

+0

@Thomas, tôi đã cập nhật câu hỏi với thông tin đó, cảm ơn. –

+0

Điều đó có vẻ ổn rồi; đối số -framework là ở nơi đã đăng ký.Điều duy nhất tôi có thể tưởng tượng là bạn cần một khung công tác khác, hoặc khuôn khổ được cho là giới thiệu một sự phụ thuộc shlib và bằng cách nào đó không phải là (tôi không biết liệu khung Carbon có phải làm điều đó hay không.) –

Trả lời

4

Bạn sẽ tự đá khi bạn thấy câu trả lời cho điều này! Hãy thử thay đổi này:

link_args = ['-framework Carbon'] if platform == 'Darwin' else [] 

này:

link_args = ['-framework', 'Carbon'] if platform == 'Darwin' else [] 

Khi tôi thực hiện thay đổi này, tôi đã có thể làm một xây dựng sạch và nhập khẩu các mô-đun ngay lập tức :)

+0

Không thể tin được. Cảm ơn! –

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