跨平臺專案組織——Codeblocks & VC

ztguang發表於2016-02-01

http://blog.csdn.net/wqvbjhc/article/details/8013256

一、概述

最終研究跨平臺開發專案。

平臺:主要有Windows和Linux兩種平臺(Mac平臺沒機會接觸,暫不考慮)。

原則:使用跨平臺開發工具與開發庫。主要開發環境為Windows下的VC,完成後再到其他平臺去除錯。

工具:本人常用跨平臺開發工具為Codeblocks,常用跨平臺庫為wxWidgets, Opencv, rapidXml, tcmalloc,OTL, Sqlite.最友好的開發環境莫過於Windows下的Visual Studio.所以跨平臺專案IDE有兩種,VS與Codeblocks。庫也有兩種VC與gcc.

二、專案檔案組織

專案檔案組織如下:

目錄

 

作用

3rdparty

1.原始碼—直接儲存

2.庫檔案—static lib名稱—win(include,lib)

                 linux(include,lib)
3.庫檔案—動態庫名稱—win(dll檔案)

                           linux(.so檔案)

存在第三方庫,可為原始碼與可為SDK庫檔案

Doc

按文件類別組織

存在相關文件

build

include—存放庫的標頭檔案(如專案有匯出庫的話,若無則為空)

lib--存放庫檔案(如專案有匯出庫的話,若無則為空),可分Debug/Release兩種子目錄

bin--存放生成的檔案(exe,lib,so,a等),可分Debug/Release兩種子目錄

obj—存放編譯與連結生成中間檔案,按每個子專案組織,每個子專案資料夾中又分Debug/Release兩種子目錄

編譯與連結生成的目標檔案、庫檔案、程式或其他檔案。該資料夾由程式編譯連結時自動生成。

project

按專案名組織.

專案程式目錄,其下包括各個子專案

 

VC工程有.sln總工程檔案與各.vcxproject專案檔案,其中.sln與project資料夾同一級,.vcxproject放在project下各子目錄裡面。

Codeblocks工程有.workspace總工程檔案與各.cbp專案檔案,其中.workspace與project資料夾同一級,. Cbp(分為linux與windows兩個cbp檔案,使用不同的配置)放在project下各子目錄裡面。

這樣,在widnows下編譯好.sln與win的cbp,然後再到linux平臺下編譯linux的cbp

三、IDE設定

組織好專案檔案與總工程檔案,把專案檔案都載入到總工程檔案中。

1.VC的設定

包含的標頭檔案:專案屬性—配置屬性—C/C++--常規 中的附加包含目錄中新增上所需要3rdparty中標頭檔案路徑,使用相對路徑。如下圖所示。

 

包含的庫檔案:專案屬性—配置屬性—連結器—常規 中的附加庫目錄新增上所需要3rdparty中庫檔案路徑,使用相對路徑。如下圖所示。

專案屬性—配置屬性—連結器—輸入 中的附加依賴項新增上所需要3rdparty中庫檔名。如下圖所示(使用附加庫目錄有隻需要新增檔名而不必理會路徑的好處)。

 

libjasper.lib

libjpeg.lib

libpng.lib

libtiff.lib

zlib.lib

opencv_core240.lib

opencv_imgproc240.lib

opencv_ml240.lib

opencv_video240.lib

opencv_features2d240.lib

opencv_calib3d240.lib

opencv_objdetect240.lib

opencv_contrib240.lib

opencv_legacy240.lib

opencv_flann240.lib

vfw32.lib

 

生成的檔案與中間檔案:專案屬性—配置屬性—常規中的輸出目錄、中間目錄設定成與build資料夾下的bin與obj目錄,如下圖所示(儘量使用編譯器的內建變數)。

$(SolutionDir)\build\bin\$(Configuration)\

$(SolutionDir)\build\obj\$(ProjectName)\$(Configuration)\

 

生成事件:對於庫專案,生成後我們希望能夠把lib,a與h標頭檔案存放在build資料夾下的lib與 include相應位置於,可能利用vc中的後期生成事件功能,在命令列中輸入指令碼語言(能在cmd中執行的語言),如下圖所示(例子是如lib資料夾下 Debug/Release目錄不存在,則建立它,然後把生成的庫檔案拷到生成的資料夾下,再把標頭檔案拷到build\include資料夾下)。

if  notexist "$(SolutionDir)build\lib\$(ConfigurationName)" mkdir"$(SolutionDir)build\lib\$(ConfigurationName)"

copy "$(TargetDir)$(TargetName).lib""$(SolutionDir)build\lib\$(ConfigurationName)"

if  notexist "$(SolutionDir)build\include" mkdir"$(SolutionDir)build\include"

copy "$(ProjectDir)inc\*.h""$(SolutionDir)build\include"

 

2.Codeblocks的設定

標頭檔案與庫檔案位置:專案—Build option—Search directories—Compiler 中加上所需要3rdparty中標頭檔案路徑,使用相對路徑。如下圖所示。

專案—Build option—Search directories—Linker 中加上所需要3rdparty中庫檔案路徑,使用相對路徑。如下圖所示。

包含的庫檔案:專案—Build option—Linker settings 中加上所需要3rdparty的庫檔名稱和編譯選項(如靜態編譯)。如下圖所示。

linux則在other linker options輸入如下引數:

-static

-fvisibility=hidden -fPIC

-Wl,--version-script src/xteiva_linux.script

-Wl,--retain-symbols-file src/xteiva_linux.symbol

-lopencv_contrib -lopencv_legacy -lopencv_ml-lopencv_stitching -lopencv_videostab -lopencv_gpu -lopencv_nonfree-lopencv_objdetect -lopencv_calib3d -lopencv_photo -lopencv_video-lopencv_features2d -lopencv_highgui

-llibjasper -llibtiff -llibpng -llibjpeg

-lopencv_flann -lopencv_imgproc -lopencv_core -lzlib

-lswscale -lavutil -lavformat -lavcodec

-lxml2 -lgmodule-2.0 -lgstreamer-0.10 -lgstbase-0.10

-lgthread-2.0 -lglib-2.0 -lgobject-2.0 -lfontconfig-lfreetype -lpango-1.0 -lcairo -lpangocairo-1.0 -lpangoft2-1.0 -lgio-2.0-lgdk-x11-2.0 -lgtk-x11-2.0

-ldl -lm -lpthread -lrt -lstdc++

-Wl,-soname, libxte_iva.so.0

 

生成的檔案與中間檔案:專案屬性—Build targets中設定Output filename, Object outputdir成與build資料夾下的bin與obj目錄,如下圖所示(儘量使用編譯器的內建變數)。

..\..\build\bin\Debug\$(PROJECT_NAME)d.dll

..\..\build\obj\IVA_DLL\Debug

 

生成事件:對於庫專案,生成後我們希望能夠把lib,a與h標頭檔案存放在build資料夾下的lib與 include相應位置於,可能利用codeblocks中的Pre/post build steps功能(專案—Buildoption—Pre/post build steps),在Post-build step輸入指令碼語言(能在cmd中執行的語言),如下圖所示(例子是如lib資料夾下Debug/Release目錄不存在,則建立它,然後把生成的庫 檔案拷到生成的資料夾下,再把標頭檔案拷到build\include資料夾下)。

 

windows系統

cmd /C if  not exist ..\..\build\lib\Debugmkdir "..\..\build\lib\Debug"

cmd /C copy"..\..\build\bin\Debug\lib$(PROJECT_NAME).a""..\..\build\lib\Debug"

cmd /C if  not exist"..\..\build\include" mkdir"..\..\build\include"

cmd /C copy "inc\*.h""..\..\build\include"

 

linux系統

if [ ! -d "../../build/lib/Debug" ];then mkdir -p "../../build/lib/Debug"; fi

if [ -f"../../build/bin/Debug/lib$(PROJECT_NAME).a" ]; then cp"../../build/bin/Debug/lib$(PROJECT_NAME).a""../../build/lib/Debug"; fi

if [ ! -d "../../build/include" ]; thenmkdir "../../build/include"; fi

cp inc/*.h "../../build/include"

ln -s ../../build/bin/$(PROJECT_NAME)d.so.0.2.0../../build/bin/$(PROJECT_NAME)d.so.0

ln -s ../../build/bin/$(PROJECT_NAME)d.so.0.2.0../../build/bin/$(PROJECT_NAME)d.so

 

<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
閱讀(433) | 評論(0) | 轉發(0) |
給主人留下些什麼吧!~~
評論熱議

相關文章