我有一个main.cpp
像这样:
#include <boost/python.hpp>
const char* greeting()
{
return "Hello world?";
}
BOOST_PYTHON_MODULE(test)
{
using namespace boost::python;
def("greeting", greeting);
}
和
CMakeLists.txt
文件:project(test)
cmake_minimum_required(VERSION 2.8)
# get boost
set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREADED ON)
find_package(Boost COMPONENTS
system
thread
python
REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})
# get python
find_package(PythonLibs REQUIRED)
include_directories(${PYTHON_INCLUDE_DIRS})
link_directories(${PYTHON_LIBRARIES})
add_library(test SHARED
main.cpp
)
我可以运行
cmake
和make
了。它为我输出了一个不错的libtest.so
小文件。为了进行测试,我有一个Python脚本,如下所示:import libtest
print(libtest.greeting())
在与
libtest.so
相同的目录中运行此命令将出现以下错误:Traceback (most recent call last):
File "test.py", line 1, in <module>
import libtest
ImportError: /home/travis/projects/boost-python-test/build/libtest.so: undefined symbol: _ZNK5boost6python7objects21py_function_impl_base9max_arityEv
kes!
make VERBOSE=1
的问题很明显...创建我的libtest.so
的行如下所示:/usr/bin/c++ -fPIC -shared -Wl,-soname,libtest.so -o libtest.so CMakeFiles/test.dir/main.cpp.o -L/usr/lib/libpython2.7.so
我对为什么看不到该行上的
-L/usr/lib/libboost_python-mt-py27.a
感到很困惑。显然对于find_package(PythonLibs ...)
是有效的。由于某些CMake新奇事物,我无法达到要求。 最佳答案
解决这个问题的方法很简单。必须在target_link_libraries
语句之后将库与add_library
显式链接。
target_link_libraries(test
${Boost_LIBRARIES}
${PYTHON_LIBRARIES}
)
我仍然不确定为什么没有它,它是否适用于Python。魔法?