zoukankan      html  css  js  c++  java
  • 跨平台项目组织——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)
    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)uildin$(Configuration)

    $(SolutionDir)uildobj$(ProjectName)$(Configuration)

     

    生成事件:对于库项目,生成后我们希望能够把lib,a与h头文件存放在build文件夹下的lib与 include相应位置于,可能利用vc中的后期生成事件功能,在命令行中输入脚本语言(能在cmd中运行的语言),如下图所示(例子是如lib文件夹下 Debug/Release目录不存在,则创建它,然后把生成的库文件拷到生成的文件夹下,再把头文件拷到buildinclude文件夹下)。

    if  notexist "$(SolutionDir)buildlib$(ConfigurationName)" mkdir"$(SolutionDir)buildlib$(ConfigurationName)"

    copy "$(TargetDir)$(TargetName).lib""$(SolutionDir)buildlib$(ConfigurationName)"

    if  notexist "$(SolutionDir)buildinclude" mkdir"$(SolutionDir)buildinclude"

    copy "$(ProjectDir)inc*.h""$(SolutionDir)buildinclude"

     

    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目录,如下图所示(尽量使用编译器的内置变量)。

    ....uildinDebug$(PROJECT_NAME)d.dll

    ....uildobjIVA_DLLDebug

     

    生成事件:对于库项目,生成后我们希望能够把lib,a与h头文件存放在build文件夹下的lib与 include相应位置于,可能利用codeblocks中的Pre/post build steps功能(项目—Buildoption—Pre/post build steps),在Post-build step输入脚本语言(能在cmd中运行的语言),如下图所示(例子是如lib文件夹下Debug/Release目录不存在,则创建它,然后把生成的库 文件拷到生成的文件夹下,再把头文件拷到buildinclude文件夹下)。

     

    windows系统

    cmd /C if  not exist ....uildlibDebugmkdir "....uildlibDebug"

    cmd /C copy"....uildinDebuglib$(PROJECT_NAME).a""....uildlibDebug"

    cmd /C if  not exist"....uildinclude" mkdir"....uildinclude"

    cmd /C copy "inc*.h""....uildinclude"

     

    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) |
    给主人留下些什么吧!~~
    评论热议
  • 相关阅读:
    [Lydsy1706月赛]大根堆
    某考试 T1 Function
    [SHOI2016] 随机序列
    某考试 T1 至危警告
    某考试 T2 yja
    bzoj1880 [Sdoi2009]Elaxia的路线
    bzoj1804 [Ioi2007]Flood 洪水
    bzoj4546 codechef XRQRS
    bzoj4547 小奇的集合
    bzoj1443 [JSOI2009]游戏Game
  • 原文地址:https://www.cnblogs.com/ztguang/p/12648728.html
Copyright © 2011-2022 走看看