跨平台项目组织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 "));]]

posted @ 2012-11-29 15:03  phata  阅读(1705)  评论(6编辑  收藏  举报