Ubuntu 15.04 上 libboost_python-py34 的链接器错误
Linker error with libboost_python-py34 on Ubuntu 15.04
我一定是在尝试在 Ubuntu Linux 15.04 (Vivid Vervet) 上使用 boost-python 和 libboost-python1.55- 时犯了一些简单的错误已安装开发包。
我正在尝试构建一个简单的测试文件,如下所示:
$ 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;
}
谁能看出我做错了什么?
在你的编译器调用中让我印象深刻的第一件事是你已经在命令行上使用它们的源文件之前列出了这些库。
这通常适用于共享库,但并不完全正确。例如,如果您使用的是静态库,它就会中断,因为只有归档中的对象需要满足命令行中早期事物的符号。但这似乎在这里有所作为,即使我们使用的是共享库:
$ 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++
调用成功并生成正确链接的可执行文件。
我一定是在尝试在 Ubuntu Linux 15.04 (Vivid Vervet) 上使用 boost-python 和 libboost-python1.55- 时犯了一些简单的错误已安装开发包。
我正在尝试构建一个简单的测试文件,如下所示:
$ 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;
}
谁能看出我做错了什么?
在你的编译器调用中让我印象深刻的第一件事是你已经在命令行上使用它们的源文件之前列出了这些库。
这通常适用于共享库,但并不完全正确。例如,如果您使用的是静态库,它就会中断,因为只有归档中的对象需要满足命令行中早期事物的符号。但这似乎在这里有所作为,即使我们使用的是共享库:
$ 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++
调用成功并生成正确链接的可执行文件。