青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

馭風萬里無垠

用Boost.Python + CMake + wxPython構建跨語言GUI程序<一>

單純用C/C++做UI程序的盛況已經成為過去時,如果要做跨平臺的UI程序,那么可供選擇的更是為數不多。如果不考慮跨平臺的因素,那么Windows上邊,c#絕對是最佳的選擇,因為微軟的.NET投資大部分在這個上頭,而且有WPF的支持,至少比Java的Swing/SWT/FlashFX要高效和漂亮很多。 如果想跨Posix系統和Windows這兩個平臺,不嫌麻煩的話可以選擇Java (MONO的法律協議還是個問題);但是動態語言的特性決定了它來做界面更有優勢,譬如函數可以隨便做參數傳遞,變量類型可以隨便變換等。

最近在關注這個方面的東東,恰好就發現了和自己的經驗、興趣很相合的一個選擇:wxWidgets + Python = wxPython.這個項目底層部分是用c++來實現的,基本架構據說和MFC很像,我的那一點可憐的UI經驗都來源于MFC,因此必要的時候查下代碼應該沒大的難度。上層的部分有很多語言的bingding,最成熟的部分則是python綁定的wxPython. 找到了切合點,另外一個問題又隨之而來,UI畢竟只是負責來做用戶交互的,底層的邏輯(網絡、業務)大多還是要c++來寫,或者已經有的C++代碼最好能少改動就可以重復利用。

突然靈機一動想起來,Boost庫里邊剛還有這么一個東東來處理跨c++ 和 Python 的,可以導出或者內嵌, 于是翻出來體驗一番:

 

  • 編譯Boost.Python

不經意發現Boost已經有了1.39版本了,我機器上的還是1.37,向來樂于追新的我對于這種自我學習的東西更是不會吝惜時間了,馬上將其7z包拖了下來,居然驚奇的發現里邊已經有了我很喜歡的CMakeLists.txt文件了,原來可以用CMake編譯,boost里邊我最討厭的就是那個bjam了,學了幾次都沒有完全琢磨明白,這次就下定決心也要把CMake版本的編出來。

這里需要編譯的是libboost_python.so,其它的東西,出于更新的目的,還是把常用的幾個也編一下好了。

7z x boost_1_39_0.7z
cd boost_1_39_0/
mkdir mybuild
cd mybuild
cmake ../

居然報錯了:

-- ##########################################################################
--
--               Only Boost.Build is officially supported.
--
--                       This is not Boost.Build.
--
--  This is an alternate, cmake-based build system that is currently under development.
--  To try it out, invoke CMake with the argument
--         -DCMAKE_IS_EXPERIMENTAL=YES_I_KNOW
--  Or use the gui to set the variable CMAKE_IS_EXPERIMENTAL to some value.
--  This will only be necessary the first time.
--
--  For more information on boost-cmake see the wiki:
--      https://svn.boost.org/trac/boost/wiki/CMake
--
--  Subscribe to the mailing list:
--      http://lists.boost.org/mailman/listinfo.cgi/boost-cmake
--
--  NOTE:  Please ask questions about this build system on the boost-cmake list,
--         not on other boost lists.
--
--  And/or check the archives:
--      http://news.gmane.org/gmane.comp.lib.boost.cmake
--
-- ##########################################################################

 

還好問題不大,頂多加上那個選項就是了,有問題自己搞定:

cmake -DCMAKE_IS_EXPERIMENTAL=YES_I_KNOW ../

接下來OK了,看看那些選項可以改動,于是ccmake .  , 去掉不需要的variants,將動態庫標上版本號,就是這么幾個:

BUILD_DEBUG        OFF
BUILD_STATIC       OFF
BUILD_VERSIONED    ON

然后,c/g重新生成cache就可以了。接下來是make,不過照例看一下有哪些可以編, make help之后好大的一堆,這里就選需要的吧:

make help | grep boost
... boost_date_time
... boost_date_time-mt-shared
... boost_regex
... boost_regex-mt-shared
... boost_serialization
... boost_serialization-mt-shared
... boost_wserialization
... boost_wserialization-mt-shared
... boost_graph
... boost_graph-mt-shared
... boost_python
... boost_python-mt-shared
... boost_system
... boost_system-mt-shared
... boost_prg_exec_monitor
... boost_prg_exec_monitor-mt-shared
... boost_test_exec_monitor
... boost_unit_test_framework
... boost_unit_test_framework-mt-shared
... boost_filesystem
... boost_filesystem-mt-shared
... boost_iostreams
... boost_iostreams-mt-shared
... boost_program_options
... boost_program_options-mt-shared
... boost_signals
... boost_signals-mt-shared
... boost_thread
... boost_thread-mt-shared
... boost_wave
... boost_wave-mt-shared

需要的就是這么幾個了:

make boost_date_time  boost_regex  boost_python boost_system boost_unit_test_framework boost_filesystem boost_thread  boost_signals

編譯的過程中,發現有些不對,因為有:

Linking CXX shared library ../../../lib/libboost_date_time-gcc44-mt-1_38.so

不是1.39嗎,怎么版本號不對?趕緊查一下 ../CMakeLists.txt,發現:

grep BOOST_VERSION ../CMakeLists.txt
set(BOOST_VERSION_MAJOR 1)
set(BOOST_VERSION_MINOR 38)
set(BOOST_VERSION_SUBMINOR 0)
set(BOOST_VERSION "${BOOST_VERSION_MAJOR}.${BOOST_VERSION_MINOR}.${BOOST_VERSION_SUBMINOR}")
if(BOOST_VERSION_SUBMINOR GREATER 0)
"include/boost-${BOOST_VERSION_MAJOR}_${BOOST_VERSION_MINOR}_${BOOST_VERSION_SUBMINOR}")
else(BOOST_VERSION_SUBMINOR GREATER 0)
"include/boost-${BOOST_VERSION_MAJOR}_${BOOST_VERSION_MINOR}")
endif(BOOST_VERSION_SUBMINOR GREATER 0)
#  install(EXPORT boost-targets DESTINATION "lib/Boost${BOOST_VERSION}")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Boost ${BOOST_VERSION}")
set(CPACK_PACKAGE_VERSION "${BOOST_VERSION}")
set(CPACK_PACKAGE_VERSION_MAJOR "${BOOST_VERSION_MAJOR}")
set(CPACK_PACKAGE_VERSION_MINOR "${BOOST_VERSION_MINOR}")
set(CPACK_PACKAGE_VERSION_PATCH "${BOOST_VERSION_SUBMINOR}")
set(CPACK_NSIS_DISPLAY_NAME "Boost ${BOOST_VERSION_MAJOR}.${BOOST_VERSION_MINOR}.${BOOST_VERSION_SUBMINOR}")
set(CPACK_PACKAGE_FILE_NAME "Boost-${BOOST_VERSION}-vc6")
set(CPACK_PACKAGE_FILE_NAME "Boost-${BOOST_VERSION}-vc7")
set(CPACK_PACKAGE_FILE_NAME "Boost-${BOOST_VERSION}-vc71")
set(CPACK_PACKAGE_FILE_NAME "Boost-${BOOST_VERSION}-vc8")
set(CPACK_PACKAGE_FILE_NAME "Boost-${BOOST_VERSION}-vc9")
set(CPACK_PACKAGE_FILE_NAME "Boost-${BOOST_VERSION}-borland")
"http://www.osl.iu.edu/~dgregor/Boost-CMake/${BOOST_VERSION}/"

將那個38改正成為39就可以了。重復make,生成的庫全在lib目錄下了。

 

編譯完了之后,才發現make install并不能將這些安裝到系統里邊去,因為它有開始編譯沒有選擇的庫了,真浪費時間,也許這個是它們要堅持其為Experimental Support的緣故吧,而且accumulators庫的編譯還有個問題導致編譯不通過。

到這里只能再用bjam投機一下,讓它的install命令把頭文件拷貝過去,然后自己手工拷貝庫文件了:

cd ../
./bootstrap
./bjam --with-system --libdir=/usr/local/lib threading=multi variant=release link=shared runtime-link=shared toolset=gcc install 
這里之所以指定libdir是因為默認bjam會將庫文件安裝到/lib/下邊,不知道是不是個bug。好處是只需要指定一個庫的編譯,bjam就可以在install的時間將所有的頭文件準備就緒了。
查看一下:
ls -l /usr/local/include/boost-1_39/boost/python

文件已經在了,再次回到cmake的臨時目錄:

cd mybuild/lib
su
xxxxx
cp libboost*  /usr/local/lib/
ls -lh /usr/local/lib/libboost_python-gcc*
-rwxr-xr-x 1 root root 5.2M 2009-08-09 09:57 /usr/local/lib/libboost_python-gcc44-mt-1_39.so

OK,boost.python環境準備妥當了,下一步體驗一下其Helloworld。

 

  • 初試Boost.Python<CMake項目>

新建一個目錄,并用CMake搭建項目環境:

cd
mkdir study
cd study
mkdir boost.python
cd boost.python
mkdir build
touch CMakeLists.txt
mkdir HelloWorld

這里的boost.python作為一個根目錄,build目錄用于編譯和測試,CMakeLists.txt用于組織各個子項目,剩下的就是每個項目一個子目錄了,起步的這個就是boost.python文檔提供的HelloWorld了。根目錄下的CMakeLists.txt如下:

cmake_minimum_required(VERSION 2.6)
set(BOOST_INCLUDEDIR /usr/local/include/boost-1_39)
set(BOOST_LIBRARYDIR /usr/local/lib)
set(Boost_FIND_VERSION_EXACT TRUE)
set(Boost_Debug TRUE)
set(Boost_ADDITIONAL_VERSIONS "1.39" "1.39.0")
include(FindBoost)
find_package(Boost 1.39.0 COMPONENTS python thread unit_test_framework)
if (NOT Boost_FOUND)
message(FATAL " Boost library not found!")
endif()
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
include_directories(${Boost_INCLUDE_DIRS} /usr/local/include/python2.6/)
add_subdirectory(HelloWorld)

中間的一大堆是用于保證能夠找到1.39版本的庫的,因為cmake 2.6.4并不能很好的找到,默認總是找到1.38的,如果沒有安裝多個版本的boost,可能沒有這么麻煩。接下來就是把HelloWorld那個子目錄包進來。

cd HelloWorld
cat CMakeLists.txt
具體內容如下(這里將默認CMake生成的動態庫的lib前綴去掉,因為python不喜歡這個,:-)):
project(HelloWorld)
include_directories(${Boost_INCLUDE_DIRS})
add_library(hello SHARED test.cpp)
set_target_properties(hello PROPERTIES PREFIX "")
target_link_libraries(hello ${Boost_LIBRARIES})
編輯test.cpp,將測試代碼拿進來
#include <string>
#include <boost/python.hpp>
using namespace boost::python;
struct World
{
void set(std::string msg) { this->msg = msg; }
std::string greet() { return msg; }
std::string msg;
};
//Wrapper
BOOST_PYTHON_MODULE(hello)
{
class_<World>("World")
.def("greet", &World::greet)
.def("set", &World::set)
;
}
 
編譯之:
cd ../build
cmake ../
make
輸出如下:
Scanning dependencies of target hello
[100%] Building CXX object HelloWorld/CMakeFiles/hello.dir/test.cpp.o
Linking CXX shared library ../lib/hello.so
[100%] Built target hello
查看生成的庫文件:
cd lib
ls -lh hello.so
file hello.so

接下來用測試一番,啟動python:

python
...............
>>> import hello
>>> help(hello.World.set)
Help on method set:
set(...) unbound hello.World method
set( (World)arg1, (str)arg2) -> None :
C++ signature :
void set(World {lvalue},std::string)
>>> obj = hello.World()
>>> obj.set("hello world!")
>>> obj.greet()
'hello world!'
>>> obj.set("Another string")
>>> obj.greet()
'Another string'
>>> del obj
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'hello', 'readline', 'rlcompleter']
>>> quit()

這里嘗試的幾個方法都已經湊效:構造、析構、greet/set,剛好就是前邊expose的那些了:

class_<World>("World") .def("greet", &World::greet) .def("set", &World::set) ;

 

下一步再嘗試一些復雜的東東。

posted on 2009-08-09 11:34 skyscribe 閱讀(4766) 評論(0)  編輯 收藏 引用

<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

導航

統計

常用鏈接

留言簿(3)

隨筆分類

隨筆檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            老牛影视一区二区三区| 亚洲久久视频| 久久精品国产第一区二区三区最新章节 | 欧美一级一区| 亚洲日本免费电影| 亚洲国产日本| 99国产精品自拍| 亚洲欧美综合精品久久成人| 亚洲欧美日韩在线观看a三区| 亚洲天堂网在线观看| 亚洲综合精品四区| 久久亚裔精品欧美| 亚洲精品日韩综合观看成人91| 一级日韩一区在线观看| 欧美在线黄色| 欧美剧在线免费观看网站| 欧美视频精品在线| 91久久精品国产91久久| 亚洲欧美国产不卡| 亚洲黄色成人久久久| 艳妇臀荡乳欲伦亚洲一区| 亚洲一区二区四区| 欧美日韩国产一级片| 亚洲成色999久久网站| 欧美在线啊v| 亚洲另类视频| 欧美日韩免费一区二区三区视频 | 亚洲午夜精品17c| 久久久99免费视频| 狠狠狠色丁香婷婷综合久久五月| 国产一区清纯| 久久九九热免费视频| 亚洲一区二区综合| 国产精品久久毛片a| 亚洲一区二区三区国产| 日韩一区二区久久| 国产精品成人一区二区艾草| 亚洲日本va午夜在线影院| 免费亚洲电影| 欧美二区在线看| 亚洲视频一区二区| 一本色道久久综合亚洲精品按摩| 欧美日韩成人在线| 亚洲视频电影在线| 亚洲欧美视频在线观看视频| 国产一区二区三区精品久久久| 久久久精品一品道一区| 久久综合成人精品亚洲另类欧美| 亚洲大片一区二区三区| 亚洲精品一线二线三线无人区| 欧美视频一区二区三区| 亚洲综合色激情五月| 久久av免费一区| 一本色道久久综合亚洲精品不卡| 亚洲中无吗在线| 亚洲免费激情| 久久久之久亚州精品露出| 一区二区三区四区五区视频 | 亚洲综合二区| 久久亚洲精品欧美| 销魂美女一区二区三区视频在线| 久久国产精品久久久久久久久久| 久久精品国产2020观看福利| 伊人一区二区三区久久精品| 亚洲人人精品| 亚洲精选大片| 免费观看亚洲视频大全| 久久一区中文字幕| 狠狠色丁香婷婷综合久久片| 亚洲天堂网在线观看| 亚洲深夜福利在线| 国产欧美在线播放| 中文在线不卡| 欧美色网一区二区| 亚洲精品你懂的| 亚洲大胆人体在线| 欧美国产日韩一区二区三区| 欧美成人自拍视频| 亚洲精品视频一区| 欧美揉bbbbb揉bbbbb| 亚洲另类在线视频| 午夜精品影院在线观看| 国产日本亚洲高清| 久久噜噜亚洲综合| 亚洲三级毛片| 欧美一区二视频在线免费观看| 国产日韩欧美黄色| 久久久久久久国产| 亚洲人成久久| 久久国产精品99国产精| 在线观看不卡av| 欧美日本三区| 久久精品一二三区| 欧美黄在线观看| 亚洲新中文字幕| 国产一区美女| 欧美日韩美女在线| 久久人91精品久久久久久不卡| 欧美成人蜜桃| 欧美中文在线免费| 久久精品久久综合| 这里是久久伊人| 欧美中文字幕视频在线观看| 亚洲片在线资源| 免费观看亚洲视频大全| 亚洲一区二区成人在线观看| 激情自拍一区| 欧美日韩情趣电影| 亚洲欧美日韩综合国产aⅴ| 日韩视频一区二区三区| 欧美暴力喷水在线| 免费在线日韩av| 女主播福利一区| 久久综合狠狠综合久久综合88| 亚洲欧美一区二区原创| 亚洲一区二区三区四区中文| 一本色道久久综合狠狠躁篇的优点 | 亚洲免费网站| 亚洲午夜国产成人av电影男同| 亚洲色无码播放| 午夜一区二区三区在线观看| 亚洲综合欧美日韩| 欧美在线高清| 久久夜色精品亚洲噜噜国产mv | 欧美激情一区三区| 亚洲欧洲在线播放| 亚洲欧洲一区| 亚洲久久成人| 亚洲欧美日韩综合一区| 欧美在线播放一区| 亚洲国产精品久久久久婷婷884| 亚洲国产三级网| 亚洲高清视频在线观看| 最新成人av在线| 欧美在线免费一级片| 香蕉国产精品偷在线观看不卡| 久久久美女艺术照精彩视频福利播放| 久久国产毛片| 国产精品99久久久久久久久 | 亚洲色图自拍| 美日韩免费视频| 午夜亚洲一区| 国产精品亚洲第一区在线暖暖韩国| 在线不卡a资源高清| 久久精品日产第一区二区| 亚洲视频大全| 国产精品自拍一区| 亚洲欧美在线一区| 中文一区二区在线观看| 欧美日韩精品一区二区在线播放 | 国产三区精品| 亚洲欧美一区二区视频| 亚洲精品视频在线观看网站| 久久久久久九九九九| 久久国产日韩| 久久综合九色99| 国产欧美一区二区三区另类精品 | 久久gogo国模裸体人体| 国产精品国产三级国产专播品爱网| 久久综合色一综合色88| 欧美激情精品久久久久久大尺度| 久久亚洲综合色| 艳妇臀荡乳欲伦亚洲一区| 久久亚洲色图| 欧美精品www在线观看| 久久久99久久精品女同性| 蜜臀91精品一区二区三区| 欧美在线亚洲综合一区| 亚洲欧美国产高清| 亚洲精品一区二区三区福利| 亚洲国产一区二区三区青草影视| 久久精品国产免费观看| 国产欧美日韩综合一区在线观看| 欧美主播一区二区三区| 欧美伊人久久久久久久久影院| 国产视频在线观看一区二区| 久久久久久一区| 欧美精品一区二区视频| 亚洲性夜色噜噜噜7777| 香港成人在线视频| 亚洲蜜桃精久久久久久久| 亚洲欧美综合国产精品一区| 亚洲国产成人午夜在线一区| 99国产精品久久久久久久| 国模精品一区二区三区| 亚洲夜晚福利在线观看| 亚洲精品极品| 麻豆国产va免费精品高清在线| 亚洲一区二区三区欧美 | 亚洲高清电影| 欧美一区二区三区视频| 亚洲欧美日韩在线一区| 欧美大片一区二区| 亚洲国产精品成人| 黄色亚洲网站| 欧美一区三区三区高中清蜜桃 | 日韩视频精品| 欧美成人激情视频| 亚洲欧洲日产国码二区| 亚洲精品在线视频|