[英]Issues linking Boost.python example
我正在嘗試編譯此示例,但收到有關undefined reference to PyInt_Type/PyString_FromString/PyNumber_Divide
等的undefined reference to PyInt_Type/PyString_FromString/PyNumber_Divide
。我已經將構建鏈接到boost_python
和python3.6m
。
我正在用g++ example.cpp -L/usr/include/boost/python -lboost_python -lpython3.6m -I/usr/include/python3.6m
main.cpp中
#include <boost/python.hpp>
#include <boost/python/detail/wrap_python.hpp>
#include <boost/python/exec.hpp>
#include <boost/python.hpp>
#include <iostream>
#include <string>
#include <Python.h>
using namespace boost::python;
int main() {
Py_Initialize();
object main_module = import("__main__");
object main_namespace = main_module.attr("__dict__");
object ignored = exec("hello = file('hello.txt', 'w')\n"
"hello.write('Hello world!')\n"
"hello.close()",
main_namespace);
}
注意事項 :
另外 :如果我理解正確的話以后的事發生了:當我和lboost_python它使用了一些功能鏈接我的生成PyInt_Type
, PyString_FromString
。 它具有關於它們的返回類型和輸入參數的信息,但是沒有關於它們的實際定義(即函數體)的信息,這些信息是在其他庫中定義的(在我的情況下是python庫),我必須告訴鏈接程序有關此庫的信息,以將其包含在其中建立。 我的理解正確嗎? 如果是,那為什么對python3.6m
鏈接沒有幫助?
boost_python
可能指向python 2.7版本,例如在debian Stretch中(應該具有與ubuntu 16.04類似的軟件包)。
> cd /usr/lib/x86_64-linux-gnu
> ls -l libboost_python*.*
... libboost_python-py35.a
... libboost_python-py27.a
... libboost_python.a -> libboost_python-py27.a
... libboost_python-py27.so.1.55.0
... libboost_python-py27.so -> libboost_python-py27.so.1.62.0
... libboost_python.so -> libboost_python-py27.so
... libboost_python-py35.so.1.62.0
... libboost_python-py35.so -> libboost_python-py35.so.1.62.0
我猜該庫的python 3.6版本可能尚不可用。 如果libboost_python-py35
與python 3.6不兼容,則最簡單的選擇是使用python 3.5,即
-lboost_python-py35
用於動態鏈接。
您以錯誤的順序鏈接庫。 因為boost_python
依賴於python3.6m
,所以boost_python
必須排在最前面,而python3.6m
必須boost_python
python3.6m
。
PS:這是錯誤的: -L/usr/include
: -L
告訴鏈接器在哪里可以找到庫,但是/usr/include
包含標頭,而不是庫。 您根本不需要它,但如果需要,它是-L/usr/lib
或類似名稱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.