Boost.Python和CMake链接和加载错误

时间:2011-05-01 20:06:29

标签: 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);
}

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
    )

我可以正常运行cmakemake。它为我输出一个漂亮的小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

糟糕!问题非常清楚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的新生而陷入困境。

1 个答案:

答案 0 :(得分:8)

解决方法非常简单。在 target_link_libraries语句之后,必须明确地将库与add_library 链接。

target_link_libraries(test
        ${Boost_LIBRARIES}
        ${PYTHON_LIBRARIES}
    )

如果没有它,我仍然不确定它为什么适用于Python。魔法?