Tra*_*kel 5 cmake boost-python
我main.cpp喜欢这样:
#include <boost/python.hpp>
const char* greeting()
{
return "Hello world?";
}
BOOST_PYTHON_MODULE(test)
{
using namespace boost::python;
def("greeting", greeting);
}
Run Code Online (Sandbox Code Playgroud)
和一个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
)
Run Code Online (Sandbox Code Playgroud)
我可以跑cmake,make也很好.它libtest.so为我输出一个漂亮的小文件.为了测试它,我有一个像这样的Python脚本:
import libtest
print(libtest.greeting())
Run Code Online (Sandbox Code Playgroud)
在同一目录中运行它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
Run Code Online (Sandbox Code Playgroud)
哎呀!问题非常清楚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
Run Code Online (Sandbox Code Playgroud)
我有一个心理障碍,为什么我看不到-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}
)
Run Code Online (Sandbox Code Playgroud)
我还不确定为什么它没有那个适用于Python.魔法?
| 归档时间: |
|
| 查看次数: |
4027 次 |
| 最近记录: |