3

I compiled the boost 1.50.0 libraries using b2 with the correct Python configuration. Here's the relevant ouput from the command b2 --debug-configuration:

notice: [python-cfg] Configuring python...
notice: [python-cfg]   user-specified cmd-or-prefix: "C:\Python33z\python"
notice: [python-cfg] Checking interpreter command "C:\Python33z\python"...
notice: [python-cfg] running command 'DIR /-C /A:S "C:\Python33z\python.exe" 2>&
1'
notice: [python-cfg] running command '"C:\Python33z\python" -c "from sys import
*; print('version=%d.%d\nplatform=%s\nprefix=%s\nexec_prefix=%s\nexecutable=%s'
% (version_info[0],version_info[1],platform,prefix,exec_prefix,executable))" 2>&
1'    notice: [python-cfg] Configuring python...
notice: [python-cfg]   user-specified cmd-or-prefix: "C:\Python33z\python"
notice: [python-cfg] Checking interpreter command "C:\Python33z\python"...
notice: [python-cfg] running command 'DIR /-C /A:S "C:\Python33z\python.exe" 2>&
1'
notice: [python-cfg] running command '"C:\Python33z\python" -c "from sys import
*; print('version=%d.%d\nplatform=%s\nprefix=%s\nexec_prefix=%s\nexecutable=%s'
% (version_info[0],version_info[1],platform,prefix,exec_prefix,executable))" 2>&
1'
notice: [python-cfg] ...requested configuration matched!
notice: [python-cfg] Details of this Python configuration:
notice: [python-cfg]   interpreter command: "C:\Python33z\python"
notice: [python-cfg]   include path: "C:\Python33z\Include"
notice: [python-cfg]   library path: "C:\Python33z\libs"
notice: [python-cfg]   DLL search path: "C:\Python33z"
notice: [msvc-cfg] msvc-10.0 detected, command: 'C:\Program Files (x86)\Microsof
t Visual Studio 10.0\VC\bin\cl.exe'
notice: will use 'C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\cl.
exe' for msvc, condition <toolset>msvc-10.0

...updating 4 targets...
msvc.archive bin.v2\libs\python\build\msvc-10.0\debug\link-static\threading-mult
i\libboost_python3-vc100-mt-gd-1_50.lib
common.copy stage\lib\libboost_python3-vc100-mt-gd-1_50.lib
bin.v2\libs\python\build\msvc-10.0\debug\link-static\threading-multi\libboost_py
thon3-vc100-mt-gd-1_50.lib
        1 file(s) copied.
msvc.archive bin.v2\libs\python\build\msvc-10.0\release\link-static\threading-mu
lti\libboost_python3-vc100-mt-1_50.lib
common.copy stage\lib\libboost_python3-vc100-mt-1_50.lib
bin.v2\libs\python\build\msvc-10.0\release\link-static\threading-multi\libboost_
python3-vc100-mt-1_50.lib
        1 file(s) copied.
...updated 4 targets...


The Boost C++ Libraries were successfully built!

I have set the linker directories correctly and linked to the appropriate output files (libboost_ python3-vc100-mt-1_50.lib on release, and libboost_python3-vc100-mt-gd-1_50.lib on debug). I am using a self compiled python distribution, but I've tried with the standard ones too and the result isn't any different.

The link errors I'm getting when I compile are:

error LNK2019: unresolved external symbol "__declspec(dllimport) protected: __thiscall boost::python::detail::str_base::str_base(char const *)" (__imp_??0str_base@detail@python@boost@@IAE@PBD@Z) referenced in function "public: __thiscall boost::python::str::str(char const *)" (??0str@python@boost@@QAE@PBD@Z)
error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall boost::python::detail::str_base::~str_base(void)" (__imp_??1str_base@detail@python@boost@@QAE@XZ) referenced in function "public: __thiscall boost::python::str::~str(void)" (??1str@python@boost@@QAE@XZ)
error LNK2019: unresolved external symbol "__declspec(dllimport) class boost::python::api::object __cdecl boost::python::import(class boost::python::str)" (__imp_?import@python@boost@@YA?AVobject@api@12@Vstr@12@@Z) referenced in function _main
fatal error LNK1120: 3 unresolved externals

The test code which produced those errors boils down to:

using namespace boost::python;
object main_module = import("__main__");

I have used Boost.Filesystem with the same build configuration and it didn't cause me any problems.

I hope somebody can help me with this issue, it's really confusing me!

Update: I just read some vague text about the define BOOST_PYTHON_STATIC_LIB; i'm not sure if i'm headed in the right direction with this (since afaik it wasn't mentioned in the build process), but either way, it gives me an even more confusing error:

LINK : fatal error LNK1104: cannot open file 'python27.lib'

I don't know why it trys to link with that lib when the python-cfg output clearly shows it found my python33 dist (which my application is already linking with; python33.lib).

4

1 回答 1

5

First problem: It turns out defining BOOST_PYTHON_STATIC_LIB was indeed the correct way to fix the unresolved external link errors. It appears to be a necessary define when linking with the static lib; this seems obvious, but it is not mentioned here: http://www.boost.org/doc/libs/1_50_0/libs/python/doc/building.html.

Second problem: After adding that define, the next link error happened because I didn't run b2 clean before re-building with the correct Python configuration (ie. nothing was re-compiled until cleaned!), this should have been obvious from the lack of compiler related output, but it did fool me, so it's just another little thing to look out for.

于 2012-08-05T17:56:22.423 回答