2011-03-08 27 views
6

मैं अपने गेम के लिए boost.python जोड़ रहा हूं। मैं स्क्रिप्ट में उनका उपयोग करने के लिए अपने वर्गों के लिए रैपर लिखता हूं। समस्या उस लाइब्रेरी को मेरे ऐप से जोड़ रही है। मैं cmake बिल्ड सिस्टम का उपयोग कर रहा हूं।बूस्ट पायथन लिंकिंग

अब मैं एक सरल इसके लिए 1 फ़ाइल और makefile साथ अनुप्रयोग है:

PYTHON = /usr/include/python2.7 

BOOST_INC = /usr/include 
BOOST_LIB = /usr/lib 

TARGET = main 

$(TARGET).so: $(TARGET).o 
    g++ -shared -Wl,--export-dynamic \ 
    $(TARGET).o -L$(BOOST_LIB) -lboost_python \ 
    -L/usr/lib/python2.7/config -lpython2.7 \ 
    -o $(TARGET).so 

$(TARGET).o: $(TARGET).cpp 
    g++ -I$(PYTHON) -I$(BOOST_INC) -c -fPIC $(TARGET).cpp 

और यह काम करता है। यह मेरे लिए एक 'इतनी' फाइल बनाता है जिसे मैं अजगर से आयात कर सकता हूं।

अब सवाल: सेमीकेक के लिए इसे कैसे प्राप्त करें?

मैं मुख्य CMakeList.txt में लिखा है:

... 
find_package(Boost COMPONENTS filesystem system date_time python REQUIRED) 
message("Include dirs of boost: " ${Boost_INCLUDE_DIRS}) 
message("Libs of boost: " ${Boost_LIBRARIES}) 

include_directories(
    ${Boost_INCLUDE_DIRS} 
     ... 
) 

target_link_libraries(Themisto 
    ${Boost_LIBRARIES} 
    ... 
) 
... 

message कॉल दिखाने:

Include dirs of boost: /usr/include 
Libs of boost: /usr/lib/libboost_filesystem-mt.a/usr/lib/libboost_system-mt.a/usr/lib/libboost_date_time-mt.a/usr/lib/libboost_python-mt.a 

ठीक है, इसलिए मैं अपने प्रोजेक्ट के लिए सरल सीपीपी फ़ाइल जोड़ दिया है साथ <boost/python.hpp> के शामिल हैं। मुझे संकलन में त्रुटि मिलती है:

/usr/include/boost/python/detail/wrap_python.hpp:50:23: fatal error: pyconfig.h: No such file or directory 

इसलिए इसमें सभी आवश्यकताएं शामिल नहीं हैं निर्देशिकाएं शामिल हैं।

और दूसरा प्रश्न:

कैसे पटकथा cpp फ़ाइलें के 2-चरणीय इमारत व्यवस्थित करने के लिए? मेकफ़ाइल में मैंने दिखाया कि TARGET.o और TARGET.so, सेमेक में 2 आदेशों को कैसे संसाधित किया जाए?

जैसा कि मैं समझता हूं, सबसे अच्छा तरीका सबप्रोजेक्ट बनाना और वहां कुछ करना है।

धन्यवाद।

उत्तर

12

आप अपने सीएमके लिस्ट.txt में पाइथन के लिए अपनी निर्देशिका और libs को शामिल कर रहे हैं। PythonFindLibs मैक्रो या बूस्ट

find_package(Boost COMPONENTS filesystem system date_time python REQUIRED) 
message("Include dirs of boost: " ${Boost_INCLUDE_DIRS}) 
message("Libs of boost: " ${Boost_LIBRARIES}) 

find_package(PythonLibs REQUIRED) 
message("Include dirs of Python: " ${PYTHON_INCLUDE_DIRS}) 
message("Libs of Python: " ${PYTHON_LIBRARIES}) 

include_directories(
    ${Boost_INCLUDE_DIRS} 
    ${PYTHON_INCLUDE_DIRS} # <------- 
     ... 
) 

target_link_libraries(Themisto 
    ${Boost_LIBRARIES} 
    ${PYTHON_LIBRARIES} # <------ 
    ... 
) 
... 
+0

के लिए उपयोग की जाने वाली वही find_package रणनीति का उपयोग करें यदि मेरी परियोजना को क्रॉसप्लेटफ़ॉर्म होना चाहिए तो क्या करें? वह लाइन खिड़कियों पर काम नहीं करेगी। – Ockonal

+1

सच है, मैंने क्रॉस प्लेटफ़ॉर्म होने के लिए अपना उत्तर अपडेट कर दिया है। – Rod

+0

ठीक है, मैं समझता हूँ। धन्यवाद। – Ockonal

संबंधित मुद्दे