【问题标题】:Error linking against boost python与boost python链接时出错
【发布时间】:2015-03-24 07:50:54
【问题描述】:

这是我的简单 HelloWorld 程序

#include <boost/python.hpp>
using namespace boost::python;

void greet() {
    // do nothing
}

BOOST_PYTHON_MODULE(HelloWorld)
{
    def("greet", greet);
}

这是我的 CMakeLists.txt 文件

cmake_minimum_required(VERSION 2.8.4)
project(HW)

find_package(Boost COMPONENTS python3 REQUIRED)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
include_directories(${Boost_INCLUDE_DIRS} /Library/Frameworks/Python.framework/Versions/3.4/include/python3.4m include)

file(GLOB_RECURSE SRC
HelloWorld.cpp
)

add_library(HelloWorld SHARED ${SRC})
target_link_libraries(HelloWorld ${Boost_LIBRARIES})

但是,我无法构建这个简单的程序,出现这个构建错误

Undefined symbols for architecture x86_64:
  "__Py_NoneStruct", referenced from:
      boost::python::detail::none() in HelloWorld.cpp.o
      boost::python::api::object::object() in HelloWorld.cpp.o
  "boost::python::detail::init_module(PyModuleDef&, void (*)())", referenced from:
      _PyInit_HelloWorld in HelloWorld.cpp.o
ld: symbol(s) not found for architecture x86_64

我错过了什么?对不起,如果这看起来像一个新手问题,但我实际上被卡住了。

【问题讨论】:

    标签: c++ boost cmake boost-python


    【解决方案1】:

    我认为您缺少指向 Python 库(而不是 Boost Python 库)的链接

    尝试类似find_package(Python) 然后target_link_libraries(HelloWorld ${Python_LIBRARY})

    另外(基于这篇帖子https://www.preney.ca/paul/archives/107)您正在构建的库的名称与BOOST_PYTHON_MODULE 中给出的名称不匹配。将其更改为 BOOST_PYTHON_MODULE(libHelloWorld),因为 cmake 隐式添加了 lib 到模块名称。

    【讨论】:

    • 我改成你建议的,还是不能链接;你为什么建议删除指向boost_python 的链接?您帖子中的链接还有针对boost_python (TARGET_LINK_LIBRARIES(yay ${Boost_LIBRARIES})) 的示例链接
    • 我不建议删除 boost python 的链接(如果不清楚,我很抱歉!我只是想强调 python 和 boost python 库是不同的)。我的意思是也为 python 添加一个 target_link_libraries。继续链接到 boost...
    • 即使添加find_package(Python)target_link_libraries(HelloWorld ${Python_LIBRARY} ${Boost_LIBRARIES}) 后仍然出现同样的错误
    • 如果我将find_package(Python) 更改为find_package(PythonLibs) 并将Python_LIBRARY 更改为PYTHON_LIBRARIES,那么它可以工作。但是,我仍然不明白(i)为什么在许多教程中,似乎不需要链接 PYTHON_LIBRARIES(ii)Python(您的建议)和 PythonLibs 之间有什么区别
    • 我不知道为什么很多教程似乎没有直接链接到 Python。 find_package(Python) vs find_package(PythonLibs) 只是我的一个错误!
    猜你喜欢
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    相关资源
    最近更新 更多