2013-04-10 119 views
9

我正在嘗試構建我的第一個Boost.Python示例。需要幫助Boost.Python入門

#include <iostream> 
#include <boost/python.hpp> 

using namespace boost::python; 


class Hello { 

public: 
    std::string greet() { 
     std::cout << "Hello World" << std::endl; 
    } 
}; 


BOOST_PYTHON_MODULE(hello) 
{ 
    class_<Hello>("Hello") 
     .def("greet", &Hello::greet); 
} 

int main() { 
    std::cout << "Boost.Python Test" << std::endl; 
    Hello hello; 
    hello.greet(); 
    return 0; 
} 

編輯:作爲@cdhowie指出,Python開發標題丟失。我找到幷包含了所需的頭文件。現在,鏈接器在抱怨:

10:43:58 **** Build of configuration BoostPythonTest-DPar for project BoostPythonTest 

**** 
make all 
Building file: ../src/BoostPythonTest.cpp 
Invoking: GCC C++ Compiler 
/usr/local/bin/g++-4.7 -I/usr/local/Cellar/python3/3.3.0/Frameworks/Python.framework/Versions/3.3/include/python3.3m -I/usr/include -I/usr/local/Cellar/gcc/4.7.2/gcc/include/c++/4.7.2 -O0 -g3 -p -pg -Wall -c -fmessage-length=0 -std=c++11 -MMD -MP -MF"src/BoostPythonTest.d" -MT"src/BoostPythonTest.d" -o "src/BoostPythonTest.o" "../src/BoostPythonTest.cpp" 
Finished building: ../src/BoostPythonTest.cpp 

Building target: libBoostPythonTest-DPar.dylib 
Invoking: MacOS X C++ Linker 
/usr/local/bin/g++-4.7 -L/usr/local/Cellar/python3/3.3.0/Frameworks/Python.framework/Versions/3.3/lib/python3.3/config-3.3m -L/usr/local/Cellar/python3/3.3.0/Frameworks/Python.framework/Versions/3.3/lib -L/usr/local/Cellar/boost/1.51.0/lib -std=c++11 -Xlinker -ldl -framework CoreFoundation -lpython3.3m -dynamiclib -o "libBoostPythonTest-DPar.dylib" ./src/BoostPythonTest.o -lpython3.3m -lboost_python-mt -lpython3.3 
Undefined symbols for architecture x86_64: 
    "boost::python::detail::init_module(PyModuleDef&, void (*)())", referenced from: 
     _PyInit_hello in BoostPythonTest.o 
ld: symbol(s) not found for architecture x86_64 
collect2: error: ld returned 1 exit status 
make: *** [libBoostPythonTest-DPar.dylib] Error 1 

我已經掛-lpython3.3m -lboost_python-mt -lpython3.3 - 還有什麼缺失?

編輯:我想我已鏈接到python3.3-config列出的所有內容。由於缺少符號,鏈接仍然不起作用。

回答

12

當發生此特定鏈接器錯誤時,它通常是針對一個版本的Python(例如Python 3.x頭文件)構建的應用程序的結果,而boost_python庫是針對差異版本(例如2)構建的。 X。

PyObject* boost::python::detail::init_module(PyModuleDef&, void(*)()); 

和下面的簽名反對的Python 2.x的建設時:

boost/python/module_init.hpp中,init_module功能建設時對Python 3.x都有以下簽名

PyObject* boost::python::detail::init_module(char const* name, void(*)()); 

正如在implementation中可以看到,Boost.Python庫中只有一個函數存在。因此,考慮到Boost.Python庫被鏈接,並且鏈接器只是抱怨無法解析3.x init_module函數,那麼很可能Boost.Python庫是針對Python 2構建的。 x版本,而應用程序代碼已針對Python 3.x頭文件構建。您可以通過轉儲Boost.Python庫的符號來驗證這一點,並檢查init_module簽名。

要解決此問題,請使用構建Boost.Python的相同版本的Python構建應用程序。在這種情況下,要麼:

  • 使用Python 2.x頭文件構建應用程序,並鏈接到Python 2.x庫。
  • 針對Python 3.x構建Boost.Python。This文檔描述了構建Boost的步驟,this文檔詳細介紹了Boost.Python。通過使用--with-python參數,在bootstrap進程中可能需要顯式提供Boost.Python將用於構建的Python可執行文件。
+0

我相信你正確地診斷了這個問題。我現在試圖在Python 3.3上構建Boost.Python。 – clstaudt 2013-04-22 09:06:38

+0

當我嘗試構建Boost.Python時,出現[以下錯誤](https://gist.github.com/anonymous/5433641)。 'gcc.link.dll ../../../../bin.v2/libs/python/build/gcc-4.2.1/debug/libboost_python.dylib ld:warning:目錄找不到選項' -L/usr/local/Cellar/python3/3.3.0/Frameworks/Python.framework/Versions/3.3/lib/python3.3/config' ld:未知選項:-R collect2:ld返回1退出狀態 這裏發生了什麼? – clstaudt 2013-04-22 09:53:35

+1

@cls:如果您使用的是Apple的GCC工具鏈版本,請嘗試將工具集指定爲'darwin'而不是'gcc'。 – 2013-04-22 13:35:53

6

您錯過了Python開發頭文件。你的Linux發行版應該有一個包。 (例如,在Debian或Ubuntu上爲python-dev)。

+1

感謝您指出錯誤。但我在OSX上,任何想法如何獲得標題?家釀似乎沒有一個公式'python-dev'。 – clstaudt 2013-04-10 15:10:49

+1

@cls我不使用OS X,所以我不能在那裏提供任何建議。也許別人可以。 – cdhowie 2013-04-10 15:19:59

+0

發現頭文件,但有鏈接器的問題,我希望得到的例子工作。 – clstaudt 2013-04-10 17:05:54

2

您正在構建一個共享庫,因爲這是一個二進制Python模塊。爲此,您需要-shared或-dynamic(檢查文檔),並且不應該有main()函數。

此外,如果這沒有幫助,並且仍然存在鏈接器錯誤,請使用「objdump -T --demangle/path/to/lib」來找出庫中包含哪些符號,以及它是否具有您需要。還要檢查「ldd」的輸出,它列出了相關的共享對象。這應該給你一個提示鏈接庫或庫的提示。

在我的系統上,我也有一個名爲「python-config」和「python2.7-config」的程序。檢查你是否有類似的東西,因爲這個腳本知道哪些庫至少要鏈接python。一個類似的工具是pkg-config,它更通用,可能也提供了boost的信息。

+0

'python3.3-config'給了我添加了一些路徑和標誌,但沒有任何效果(請參閱上面的調用)。 'otool'(顯然是'objdump'的OSX等價物)給了我例如'$ otool -T libboost_python-mt.dylib libboost_python-mt.dylib: 目錄(0個條目) 模塊索引符號索引'。 'ldd'似乎不存在於OSX上。 – clstaudt 2013-04-16 08:57:22

2

不知道這是否是這樣做的,但似乎PY_VERSION_HEX設置錯誤。 會發生什麼,如果你

#define PY_VERSION_HEX 0x03300000 

包括在BoostPythonTest.cpp Boost.Python的頭前?

+0

這是一條評論,而不是答案。 – 2017-01-23 20:45:47