2010-10-06 40 views
8

Tôi chỉ đang cố gắng biên dịch ví dụ "hello world" của boost.python KHÔNG sử dụng tất cả ma thuật bjam. Cài đặt boost.python của tôi đang hoạt động, tôi đã xây dựng thành công ví dụ với bjam và vượt qua bộ kiểm thử.Sử dụng boost.python với make thay vì bjam

Bây giờ cho dự án của tôi, tôi cần phải sử dụng tất cả các công cụ này trong môi trường thuần túy. Tôi không muốn chuyển sang công cụ xây dựng khác.

Vì vậy, cách tiếp cận ngây thơ của tôi là tất nhiên chỉ trỏ đường dẫn đến đúng tiêu đề và liên kết với đúng thư viện. Tôi xây dựng tăng python như hệ thống bố trí, tĩnh, thời gian chạy-tĩnh, có nghĩa là nó chỉ là một libboost_python.a cư trú trong/usr/local/lib.

Thật không may, tôi nhận được các biểu tượng bên ngoài chưa được giải quyết trong thư viện .so kết quả.

Đây là cố gắng của tôi để xây dựng các ví dụ từ libs/python/example/hướng dẫn/hello.cpp:

$ cat hello.cpp 
// Copyright Joel de Guzman 2002-2004. Distributed under the Boost 
// Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt 
// or copy at http://www.boost.org/LICENSE_1_0.txt) 
// Hello World Example from the tutorial 
// [Joel de Guzman 10/9/2002] 

#include <boost/python/module.hpp> 
#include <boost/python/def.hpp> 

char const* greet() 
{ 
    return "hello, world"; 
} 

BOOST_PYTHON_MODULE(hello_ext) 
{ 
    using namespace boost::python; 
    def("greet", greet); 
} 

$ g++ -I/usr/local/include -I/usr/include/python -fpic -c -o hello.o 
hello.cpp 
$ g++ -shared -Wl,-soname,"libhello.so" -L/usr/local/lib -lboost_python -fpic -o libhello.so hello.o 
$ nm -u libhello.so 
       U PyString_Type 
       w _Jv_RegisterClasses 
       U _Py_NoneStruct 
       U [email protected]@GCC_3.0 
       U _ZN5boost6python6detail11init_moduleEPKcPFvvE 
       U _ZN5boost6python6detail12gcc_demangleEPKc 
       U 
_ZN5boost6python6detail17scope_setattr_docEPKcRKNS0_3api6objectES3_ 
       U 
_ZN5boost6python7objects15function_objectERKNS1_11py_functionE 
       U _ZN5boost6python7objects21py_function_impl_baseD2Ev 
       U _ZN5boost6python9converter19do_return_to_pythonEPKc 
       U _ZN5boost6python9converter8registry5queryENS0_9type_infoE 
       U 
_ZNK5boost6python7objects21py_function_impl_base9max_arityEv 
       U 
_ZNK5boost6python9converter12registration25expected_from_python_typeEv 
       U _ZTIN5boost6python7objects21py_function_impl_baseE 
       U [email protected]@CXXABI_1.3 
       U [email protected]@CXXABI_1.3 
       U [email protected]@CXXABI_1.3 
       U _ZTVN5boost6python7objects21py_function_impl_baseE 
       U [email protected]@GLIBCXX_3.4 
       U [email protected]@GLIBCXX_3.4 
       U [email protected]@GLIBC_2.2.5 
       w [email protected]@GLIBC_2.2.5 
       U [email protected]@CXXABI_1.3 
       U [email protected]@CXXABI_1.3 
       U [email protected]@CXXABI_1.3 
       w __gmon_start__ 
       U [email protected]@CXXABI_1.3 
$ python 
>>> import libhello 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: ./libhello.so: undefined symbol: 
_ZNK5boost6python7objects21py_function_impl_base9max_arityEv 

Vì vậy, sự kỳ diệu lớn của bjam rằng khi liên kết bjam libboost_python.a tôi nhận được là gì không có biểu tượng không xác định, nhưng khi tôi làm điều đó "bằng tay" tôi nhận được những?

+0

tôi thấy rằng các bjam xây dựng sử dụng các thư viện chia sẻ của Boost.Python. Khi tôi triển khai thư viện được chia sẻ, các tác phẩm trên. Nhưng tôi chắc chắn cần một bản dựng tĩnh. Vì vậy, tại sao liên kết của libboost_python.a mang lại biểu tượng không xác định, nơi libboost_python.so hoạt động? – Philipp

Trả lời

7

Vâng, tôi đã rất ngu ngốc. Để liên kết một đã đặt đối tượng TRƯỚC KHI thư viện với các biểu tượng. Vì vậy, biến

g++ -shared -Wl,-soname,"libhello.so" -L/usr/local/lib -lboost_python -fpic -o libhello.so hello.o 

vào

g++ -shared -Wl,-soname,"libhello.so" -L/usr/local/lib hello.o -lboost_python -fpic -o libhello.so 

Đã cho tôi kết quả dự kiến, sau khi tôi biên dịch lại Boost.Python với CXXFLAGS = -fPIC.

2

Bạn có thể thử một cái gì đó như thế này:

g++ -I/usr/include/python2.4 -fpic hello.cpp -shared -lboost_python -o libhello.so 
Các vấn đề liên quan