20

include

using namespace boost::python;

struct World{
    void set(std::string msg) { this->msg = msg; }
    std::string greet() { return msg; }
    std::string msg;
};

BOOST_PYTHON_MODULE(hello)
{
    class_<World>("World")
        .def("greet", &World::greet)
        .def("set", &World::set)
    ;
}

Compile and build ok

~/boost$ g++ -fPIC -I/usr/include/python2.6 -c hello.cpp 
~/boost$ g++ -shared hello.o -o hello.so

But when import from python side, got error.

>>> import hello.so
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: ./hello.so: undefined symbol: _ZNK5boost6python7objects21py_function_impl_base9max_arityEv
>>> 

4 Answers 4

14

Solved this via "No such file or directory" error with Boost Python

g++ -c -fPIC hello.cpp -o hello.o
g++ -shared -Wl,-soname,hello.so -o hello.so  hello.o -lpython2.6 -lboost_python

did the trick for me. I hope this is as clear as possible as i was struggling with this for about half an hour now ;)

Sign up to request clarification or add additional context in comments.

Comments

7

same as other post here

g++ -c -fPIC hello.cpp -o hello.o
g++ -shared -Wl,-soname,hello.so -o hello.so  hello.o -lpython2.6 -lboost_python

But i want to stress the importance of the position of "-lpython2.6 -lboost_python". If you put them in front of input files (hello.o), they will be somehow ignored (not linked to the final hello.so). This is at least true for g++ (Ubuntu/Linaro 4.6.3-1ubuntu5).

To be simple, http://ubuntuforums.org/showthread.php?t=496287 suggested:

  g++ <.cpp or .o file(s)> [LDFLAGS] [LIBS] -o [appname]

1 Comment

As I understand it, the reason for the link-order sensitivity is that the GNU ld compile-time linker is a one-pass linker: it picks up symbols to resolve from left-to-right on the command-line, and maintains a list of unresolved symbols, so if hello.o is at the end, it introduces new unresolved symbols (that are defined in libpython2.6.so and libboost_python.so), but they can't now be resolved because there's nothing to the right that defines those symbols.
4

Oh, I just saw this post:

help needed with boost python

and problem solved

2 Comments

So was the solution to add "-lpython2.6 -lboost_python" to the link line? It is not completely clear to me what you learned from the other thread...
@ChristopherBruns Did you ever get a solution for this?
3

I had the same issue and it turned out that I was missing a constructor on my class.

1 Comment

Just had the same error, this one was so bloody sneaky!! Thanks a bunch for this remark, it could have taken me days until I noticed this

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.