跨平台項目組織2


本人以前發布過《跨平台項目組織》一文,通過在項目中的實踐,有了些修改,這是V0.2版。

一、概述

最終研究跨平台開發項目。

平台:主要有WindowsLinux兩種平台(Mac平台沒機會接觸,暫不考慮)

原則:使用跨平台開發工具與開發庫。主要開發環境為Windows下的VC,完成后再到其他平台去調試。

工具:本人常用跨平台開發工具為Codeblocks,常用跨平台庫為wxWidgets, Opencv, rapidXml, tcmalloc,OTL, Sqlite.最友好的開發環境莫過於Windows下的Visual Studio.所以跨平台項目IDE有兩種,VSCodeblocks。庫也有兩種VCgcc.

二、項目文件組織

項目文件組織如下:

目錄

  

作用

3rdparty

存儲項目使用到的第三方庫的源代碼

存儲第三方源代碼庫。

(需要編譯的第三方庫則使用編譯工具先編譯好存放—本人有自己的共享方法,以后有機會寫出來共享給大家,然后在項目中引用庫文件與頭文件就行。)

Doc

按文檔類別組織

存在相關文檔

build

include—存放庫的頭文件(如項目有導出庫的話,若無則為空)

lib--存放庫文件(如項目有導出庫的話,若無則為空),可分Debug/Release兩種子目錄

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

obj—存放編譯與鏈接生成中間文件,按每個子項目組織,每個子項目文件夾中又分Debug/Release兩種子目錄

編譯與鏈接生成的目標文件、庫文件、程序或其他文件。該文件夾由程序編譯鏈接時自動生成。

project

按項目名組織.

項目程序目錄,其下包括各個子項目

   

VC工程有.sln總工程文件與各.vcxproject項目文件,其中.slnproject文件夾同一級,.vcxproject放在project下各子目錄里面。

Codeblocks工程有.workspace總工程文件與各.cbp項目文件,其中.workspaceproject文件夾同一級,. Cbp(分為linuxwindows兩個cbp文件,使用不同的配置)放在project下各子目錄里面。

這樣,在widnows下編譯好.slnwincbp,然后再到linux平台下編譯linuxcbp

三、IDE設置

組織好項目文件與總工程文件,把項目文件都加載到總工程文件中。

1.VC的設置

包含的頭文件:項目屬性配置屬性—C/C++--常規 中的附加包含目錄中添加上所需要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文件夾下的binobj目錄,如下圖所示(盡量使用編譯器的內置變量)。

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

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

 

 

生成事件:對於庫項目,生成后我們希望能夠把lib,ah頭文件存放在build文件夾下的libinclude相應位置於,可能利用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 中加上所需要第三方庫文件路徑。如下圖所示。

包含的庫文件:項目—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文件夾下的binobj目錄,如下圖所示(盡量使用編譯器的內置變量)。

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

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

   

生成事件:對於庫項目,生成后我們希望能夠把lib,ah頭文件存放在build文件夾下的libinclude相應位置於,可能利用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

   

 所有系統

 [[if(!IO.DirectoryExists(_T("$(PROJECT_DIR)..")+wxFILE_SEP_PATH+_T("..")+wxFILE_SEP_PATH+_T("build")+wxFILE_SEP_PATH+_T("lib"))) { print (_T("$(CMD_MKDIR) $(PROJECT_DIR)..")+wxFILE_SEP_PATH+_T("..")+wxFILE_SEP_PATH+_T("build")+wxFILE_SEP_PATH+_T("lib")); }]]

[[if(!IO.DirectoryExists(_T("$(PROJECT_DIR)..")+wxFILE_SEP_PATH+_T("..")+wxFILE_SEP_PATH+_T("build")+wxFILE_SEP_PATH+_T("lib")+wxFILE_SEP_PATH+_T("Release"))) { print (_T("$(CMD_MKDIR) $(PROJECT_DIR)..")+wxFILE_SEP_PATH+_T("..")+wxFILE_SEP_PATH+_T("build")+wxFILE_SEP_PATH+_T("lib")+wxFILE_SEP_PATH+_T("Release")); }]]

[[if (IO.FileExists(_T("$(PROJECT_DIR)..")+wxFILE_SEP_PATH+_T("..")+wxFILE_SEP_PATH+_T("build")+wxFILE_SEP_PATH+_T("bin")+wxFILE_SEP_PATH+_T("Release")+wxFILE_SEP_PATH+_T("$(TARGET_OUTPUT_BASENAME).a")) ) { print (_T("$(CMD_CP) $(PROJECT_DIR)..")+wxFILE_SEP_PATH+_T("..")+wxFILE_SEP_PATH+_T("build")+wxFILE_SEP_PATH+_T("bin")+wxFILE_SEP_PATH+_T("Release")+wxFILE_SEP_PATH+_T("$(TARGET_OUTPUT_BASENAME).a $(PROJECT_DIR)..")+wxFILE_SEP_PATH+_T("..")+wxFILE_SEP_PATH+_T("build")+wxFILE_SEP_PATH+_T("lib")+wxFILE_SEP_PATH+_T("Release"));}]]

[[if(!IO.DirectoryExists(_T("$(PROJECT_DIR)..")+wxFILE_SEP_PATH+_T("..")+wxFILE_SEP_PATH+_T("build")+wxFILE_SEP_PATH+_T("include"))) { print (_T("$(CMD_MKDIR) $(PROJECT_DIR)..")+wxFILE_SEP_PATH+_T("..")+wxFILE_SEP_PATH+_T("build")+wxFILE_SEP_PATH+_T("include")); }]]

[[if (PLATFORM == PLATFORM_MSW ) print(_T("xcopy $(PROJECT_DIR)include $(PROJECT_DIR)..")+wxFILE_SEP_PATH+_T("..")+wxFILE_SEP_PATH+_T("build")+wxFILE_SEP_PATH+_T("include")+wxFILE_SEP_PATH+_T("weibosdk /EIY"));]]

[[if (PLATFORM == PLATFORM_GTK ) print(_T("rm -rf $(PROJECT_DIR)..")+wxFILE_SEP_PATH+_T("..")+wxFILE_SEP_PATH+_T("build")+wxFILE_SEP_PATH+_T("include")+wxFILE_SEP_PATH+_T("weibosdk; cp -rfu $(PROJECT_DIR)include $(PROJECT_DIR)..")+wxFILE_SEP_PATH+_T("..")+wxFILE_SEP_PATH+_T("build")+wxFILE_SEP_PATH+_T("include")+wxFILE_SEP_PATH+_T("weibosdk "));]]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM