跨平臺專案組織——Codeblocks & VC
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) 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
相關文章
- 跨平臺程式碼三種組織方式詳解
- 如何使用Photino建立Blazor專案進行跨平臺Blazor
- 前端專案檔案組織與元件命名前端元件
- SaaS平臺的組織資料模型設計模型
- 【原創】組織專案管理討論專案管理
- 專案型組織的流程之舞
- 專案管理與組織結構(轉)專案管理
- PRINCE2專案管理初探之五:專案組織(Organisation)專案管理
- vue+cordova專案打包實現跨平臺開發(一)Vue
- 小專案從0到1之跨平臺方案選型
- 前端之React實戰:建立跨平臺的專案架構前端React架構
- 專案管理過程之組織和角色 (轉)專案管理
- 專案組織規劃的原則(轉)
- 專案組織——比較而後提高(轉)
- 專案管理過程之組織和角色(轉)專案管理
- RMAN同位元組序跨平臺跨版本遷移資料庫資料庫
- RMAN同位元組序跨平臺跨版本遷移資料庫(一)資料庫
- RMAN同位元組序跨平臺跨版本遷移資料庫(二)資料庫
- RMAN跨小版本跨平臺與位元組序傳輸表空間
- rust跨平臺Rust
- 軟體專案開發團隊組員跨專案組兼職案例分析
- 專案接單平臺
- Electron框架使用vue開發跨平臺桌面工具應用-專案搭建框架Vue
- 附錄A Oracle Dataguard 物理Standby跨平臺組合支援列表Oracle
- Unity3D專案Plugins目錄組織Unity3DPlugin
- makefile 簡明教程 —— 助你更好理解 C 專案組織
- 這個開源組織裡的專案都是精品
- 案例討論:傳統專案組織為何低效?
- 專案組織結構設計或選擇(轉)
- 工程專案經理部組織經驗談(轉)
- 專案組織結構設計與選擇(轉)
- MobileLab跨平臺開發專題交流會
- 資訊系統專案管理系列之二:專案生命期和組織專案管理
- 跨平臺編譯編譯
- .NET Core 跨平臺
- WPF跨平臺方案?
- rman 跨平臺支援
- VNC 跨平臺copyVNC