• 跨平台项目组织


    跨平台项目组织

     

    一、概述

    最终研究跨平台开发项目。

    平台:主要有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 "http://www.cnblogs.com/build/lib/Debug" ];then mkdir -p "http://www.cnblogs.com/build/lib/Debug"; fi

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

    if [ ! -d "http://www.cnblogs.com/build/include" ]; thenmkdir "http://www.cnblogs.com/build/include"; fi

    cp inc/*.h "http://www.cnblogs.com/build/include"

    ln -s http://www.cnblogs.com/build/bin/$(PROJECT_NAME)d.so.0.2.0http://www.cnblogs.com/build/bin/$(PROJECT_NAME)d.so.0

    ln -s http://www.cnblogs.com/build/bin/$(PROJECT_NAME)d.so.0.2.0http://www.cnblogs.com/build/bin/$(PROJECT_NAME)d.so

    作者:wqvbjhc
    出处:https://www.cnblogs.com/wqvbjhc/
    版权:本文版权归作者和博客园共有
    转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
  • 相关阅读:
    iot 表索引dump《2》
    heap表和iot表排序规则不同
    Cannot complete the install because one or more required items could not be found.
    iot表输出按主键列排序,heap表不是
    iot 表主键存放所有数据,且按数据插入顺序排序
    iot表和heap表排序规则不同
    org.eclipse.graphiti.ui.editor.DiagramEditorInput.
    Oracle 排序规则
    perl 异步超时 打印错误
    14.6.3 Grouping DML Operations with Transactions 组DML操作
  • 原文地址:https://www.cnblogs.com/wqvbjhc/p/2700216.html
Copyright © 2020-2023  润新知