我必须在Ubuntu Linux 15.04(Vivid Vervet)上安装libboost-python1.55-dev软件包时尝试使用boost-python会犯一些简单的错误。
我正在尝试构建一个简单的测试文件:
$ g++ -o conftest -Wall -I/usr/include/python3.4m -I/usr/include/x86_64-linux-gnu/python3.4m -L/usr/lib/x86_64-linux-gnu -lboost_python-py34 -lpython3.4m conftest.cc
但是这给了我这个链接器错误:
/tmp/ccxkW5XR.o: In function `PyInit_test':
conftest.cc:(.text+0x7e): undefined reference to `boost::python::detail::init_module(PyModuleDef&, void (*)())'
collect2: error: ld returned 1 exit status
但这个符号确实存在:
$ nm -D --demangle /usr/lib/x86_64-linux-gnu/libboost_python-py34.so | grep "init_module"
0000000000033ac0 T boost::python::detail::init_module(PyModuleDef&, void (*)())
这是我正在构建的非常简单的测试代码,基于AX_BOOST_PYTHON autoconf宏使用的配置测试:
#include <boost/python/module.hpp>
BOOST_PYTHON_MODULE(test) { throw "Boost::Python test."; }
int
main ()
{
return 0;
}
谁能看到我做错了什么?
答案 0 :(得分:1)
在编译器调用中,第一件事就是你在源文件之前列出了在命令行中使用它们的库。
这通常适用于共享库,但并不严格正确。例如,如果你使用的是静态库,它就会中断,因为只包含来自存档的对象,它们需要满足命令行中早期符号的符号。但它似乎在这里有所作为,即使我们使用的是共享库:
$ g++ -o conftest -Wall -I/usr/include/python3.4m -I/usr/include/x86_64-linux-gnu/python3.4m -L/usr/lib/x86_64-linux-gnu -lboost_python-py34 -lpython3.4m conftest.cc
/tmp/ccj8Znlk.o: In function `PyInit_test':
conftest.cc:(.text+0x7e): undefined reference to `boost::python::detail::init_module(PyModuleDef&, void (*)())'
collect2: error: ld returned 1 exit status
$ g++ -o conftest -Wall -I/usr/include/python3.4m -I/usr/include/x86_64-linux-gnu/python3.4m -L/usr/lib/x86_64-linux-gnu conftest.cc -lboost_python-py34 -lpython3.4m
$ ldd conftest | grep python
libboost_python-py34.so.1.55.0 => /usr/lib/x86_64-linux-gnu/libboost_python-py34.so.1.55.0 (0x00007f6291003000)
libpython3.4m.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython3.4m.so.1.0 (0x00007f62909c2000)
第二个g++
调用成功并生成正确链接的可执行文件。