跨平台工程移植:opencv_pnp + artoolkitplus :ubuntu qtcreator--> windows qtcreator/ VS

 跨平台工程移植:源码编译的方式。

今天我要将一个ubuntu基于artoolkitplus库开发的qtcreator工程移植到widows版本下给其它同事开发。

鉴于在ubuntu下的开发都是基于cmakelists文件进行编译的,故采用windows下也进行cmake的方式。

说明:

跨平台移植你需要了解:

     1. 需要就行源码编译,两个系统识别的链接库不一致;
     2. ubuntu下有那些依赖的库,在windows需要安装好。比如opencv. 
     3. 工程中是否存在跨系统无法识别的系统依赖的头文件,采取在cmake中设置预编译选项的方式
     4. 用qtcreator比用VS更方便直接快捷,除非交付方不懂再选择VS。
     5. windows下用cmake 编译源工程的方式:    生成opencv文件后,将其对应的\build  与 \bin路径加入环境变量。
     再对自己的工程进行cmake-gui的相应操作,就会生成相应的VS工程
     编译通过。运行debug 时会出现提示xxx.dll错误提示时,将\bin下的dll拷贝到系统\windows\system32
     6 我碰到过以5的方式直接成功的,也有无法在VS编译,需要在vs工程中配opencv的情况出现,怀疑是当时没先安装opencv与对应的\build  与 \bin路径加入环境变量的缘故。

7. 跨平台头文件编译cmake的方式
--------------------------
CMmakeLists.txt中
if(WIN32)
	add_definitions(-D_CRT_SECURE_NO_WARNINGS -DAR_LIBRARY)
        ADD_DEFINITIONS(-DWINDOWS_H_)
endif()

if(UNIX)
        ADD_DEFINITIONS(-DUNIX_H_)
endif()
--------------------------
头文件.h 中
#ifdef UNIX_H_
#include <unistd.h>
#endif
#ifdef WINDOWS_H_
#include <windows.h>
#endif
-------------------------------
补充说明: windows下用cmake 编程
     生成opencv文件后,将其对应的\build  与 \bin路径加入环境变量。
     再对自己的工程进行cmake-gui的相应操作,就会生成相应的VS工程
     编译通过。运行debug 时会出现提示xxx.dll错误提示时,将\bin下的dll拷贝到系统\windows\system32 
----------------------------------------------------------------------------------------------------------
注:windows下文件路径\\,单\会认为是转义字符
   debug调试传入参数 argv[]:   参:http://blog.csdn.net/luyafei_89430/article/details/8253079

英文版:
菜单Project -> Properties -> Configuration Properties -> Debugging
在Command Arguments里填上即可。

中文版:
菜单[项目] -> 属性页 -> 配置属性 -> 调试
在[命令行参数]里填上即可。
记得不同参数之前用空格隔开。
 

1.下载与安装 :

cmake:   http://www.cmake.org/download/              

opencv:    http://sourceforge.net/projects/opencvlibrary/files/             opencv-win

安装:

       cmake直接解压出来,找到对应文件夹bin/cmake-gui  

       使用CMake生成VS2013的OpenCV解决方案  

    exe格式的双击,直接提取到对应路径下的build。即为生成的头文件与库文件路径。

说明:有的说可以直接利用这exe提取的头文件和链接库文件添加工程的VS配置就可以;也有的讲最好需要利用下面的用cmake生成install再源码再在vs中生成debug与release.

由于上次过程没记清楚,好像两种我在不同机子上分别成功过,加上很少回windows编程了,先mark,后面再试试,有问题再改正。遇到类似问题的可或已经知道的可以留言.

cmake再编译形式
参照:   http://www.nmtree.net/2014/03/19/windows_build-opencv-with-cmake-and-vs2013.html
打开CMake,在Where is the source code后面的文本框选择OpenCV的源代码,Where to build the binaries选择第2步新建的文件夹vs2013x64
点击“Configure”按钮,在弹出的对话框中,选择“Visual Studio 12 Win64”,使用默认的本地编译器,
点击“Finish”之后,等待配置完成
找到 WITH_TBB ,勾选:  


再次点击“Configure”按钮再次点击“Configure”按钮,这时就没有红色标记出现了,点击“Generate”按钮,生成OpenCV的解决方案。 
 参考:
可以通过message来输出变量的值         
message(${PROJECT_SOURCE_DIR})

FIND_PACKAGE( OpenCV REQUIRED )
ADD_EXECUTABLE( Demo SkinDetect.cpp )
TARGET_LINK_LIBRARIES( Demo ${OpenCV_LIBS} )
include_directories( Demo ${OpenCV_INCLUDE_DIRS} )

 
 

 

VS2013编译OpenCV解决方案生成库   install

打开OpenCV的解决方案,右击CMakeTargets下的INSTALL,选择“生成”,生成Debug版的dll和lib,
修改配置为“Release”,重复步骤1,生成Release版的dll和lib,
生成完毕,在OpenCV解决方案下的install文件夹里就有了dll,lib和h头文件了。
  opencv 生成的头文件库文件动态链接库文件都在install 文件夹下

2. cmake编译artoolkitplus +myproject

 
        基本同上相似,也可参考: http://www.douban.com/note/406186688/?type=like
        第一栏 Where is the source code 选择源码所在文件夹:即 xxx\source (目录下有cmakelist)
        第二栏 Where to build the binaries 选择一个build的位置,路径不含中文,一般在xxx\build 就可以了。
        选择configure,选择编译器,分别对应不同IDE,CB一般用codeblocks-minGW,VS对应VC10(2010)、VC11(2012)、VC12(2013),finish后再次configure就开始 工作了。
        configure完成后,选择中间栏所需要的部分generate就生成了对应IDE的工程文件。
        用IDE打开后全部debus、release下build即可。

        直接的artoolkitplus的cmake无需配opencv,cmake生成.sln解决方案后,需要进行几处改动。可能是系统不兼容问题吧。 

                     1)error C2039: “min”: 不是“std”的成员     error C2873: “min”: 符号不能用在 using 声明中
                        这时需要打开对于报错的.cpp文件,在头部加 #include <algorithm> 

                     2)make_pairs模板到 pairs模板 
                                          3)windows路径:如果路径中刚好有类似转义字符开头的,那么就会引起问题,所以路径中的 \必须用 \\ 的
                    4)">VS“无法查找或打开PDB文件”的解决方法 
			打开VS2013,点击菜单“工具”-“选项”。调试-》选项和设置-》调试-》
			左边点常规-》右边勾选启用源服务器支持 左边点符号-》右边勾选微软符号服务器
			在联网的情况下会自动下载符号文件 


编译artoolkitplus +myprojec编译整个工程还是以同样的原理cmake构建。
不同的是你需要添加相应的cmake链接库 

3.VS工程添加opencv的详解

详细参照:http://www.cnblogs.com/emouse/archive/2013/01/27/2878533.htmlhttp://www.douban.com/note/406186688/?type=like

          在Ubuntu里写CMakeLists.txt习惯了在windows开发感觉不习惯了,其实一样,只是VS工程的编译完全是基于IDE的方式进行的,类比编译与连接原理可知,我们需要告诉IDE相关文件与路径即可  

        环境变量:相关的动态连接库地址(dll文件)

                  C:\opencv\build\install\x64\vc12\bin;

                 C:\opencv\build\install

        VC++目录 :  include头文件路径  与  include库文件路径  

                     ->VC++目录(所有配置下操作,即debug+release下都是这个配置):包含目录是(C:\opencv\build\install\include),

                      库目录是(C:\opencv\build\install\x64\vc12\lib)

                链接文件设置 : 即为工程需要的相应路径的库文件(.lib)

                >链接器输入-附加依赖项:debug下和release下分别添加:

DEBUG版本库

opencv_imgproc249d.lib  
opencv_calib3d249d.lib  
opencv_contrib249d.lib  
opencv_core249d.lib  
opencv_features2d249d.lib  
opencv_flann249d.lib  
opencv_gpu249d.lib  
opencv_highgui249d.lib  
opencv_legacy249d.lib  
opencv_ml249d.lib  
opencv_nonfree249d.lib  
opencv_objdetect249d.lib  
opencv_ocl249d.lib  
opencv_photo249d.lib  
opencv_stitching249d.lib  
opencv_superres249d.lib  
opencv_ts249d.lib  
opencv_video249d.lib  
opencv_videostab249d.lib 
 

RELEASE版本库

opencv_ml249.lib
opencv_calib3d249.lib
opencv_contrib249.lib
opencv_core249.lib
opencv_features2d249.lib
opencv_flann249.lib
opencv_gpu249.lib
opencv_highgui249.lib
opencv_imgproc249.lib
opencv_legacy249.lib
opencv_objdetect249.lib
opencv_ts249.lib
opencv_video249.lib
opencv_nonfree249.lib
opencv_ocl249.lib
opencv_photo249.lib
opencv_stitching249.lib
opencv_superres249.lib
opencv_videostab249.lib

如果编译与连接通过生成后,运行时弹出xxx.dll缺失什么的:

                  ->32位OS把xxx\build\bin下的那些文件复制到\windows\system32下,缺什么补什么

                   ->然后依次在CMD下regsvr32 xxx.dll,即使报错也可以使用了。

无法查找或打开 PDB 文件

在那个调试里,选设置与调试,左边栏有个符号,里面有启用micosoft调试,勾上就行,还要改一个地方,其实无法打开pdb文件感觉并不影响什么,反而改过之后,程序会变慢好多。


4.  利用项目属性表配置OpenCV

参考: VisualStudio2010配置OpenCV的一种一劳永逸的方法

依据这种方式就可以很轻松的实现  VS工程添加opencv的配置,避免了每次都需要添加的麻烦。即创建项目属性表,以后的工程就只需要直接添加就可以了。。

打开VisualStudio2010,创建一个新的项目  详见:http://blog.csdn.net/bendanban/article/details/28661763

在菜单栏中选择视图-->属性管理器  (附加窗口)

然后将属性管理器的选项卡都展开

右击 Debug|Win32,选择“添加新项目属性表”

双击新添加的属性表。

编辑包含目录。添加的附加依赖项后缀之前都有一个d,这点也是唯一与Release不同的地方

添加的库文件名列表如下(注意你的版本号,千万别直接复制粘贴)

最后点击确定。

然后打开,你的项目目录下,你会看到图13所示的文件:文件复制到一个合适的目录下,保留。下次直接添加就可以了。  cv249_debug.props

--

5. 动态链接库与静态链接库

一、静态库与动态库 

      静态链接库就是程序在编译的过程中将所有的对象文件与相应库文件链接在一起生成可执行文件,程序的运行不再需要其它文件,文件以.a的形式保存;

      动态链接库是把库函数的链接的载入放到运行时,程序的运行必须要有所依赖的链接库一起。以.so形式保存;

     windows下动态库(DLL),静态库(LIB)

二、  静态链接库、动态链接库各自的特点:

1.动态链接库有利于进程间资源共享

           什么概念呢?就是说,某个程序的在运行中要调用某个动态链接库函数的时候,操作系统首先会查看所有正在运行的程序,看在内存里是否已有此库函数的拷贝了。如果有,则让其共享那一个拷贝;只有没有时才链接载入。这样的模式虽然会带来一些“动态链接”额外的开销,却大大的节省了系统的内存资源。

           C的标准库就是动态链接库,也就是说系统中所有运行的程序共享着同一个C标准库的代码段。

          而静态链接库则不同,如果系统中多个程序都要调用某个静态链接库函数时,则每个程序都要将这个库函数拷贝到自己的代码段,显然将占有更大的内存资源。

2. 将一些程序升级变得简单。

           用静态库,如果库发生变化,使用库的程序要重新编译。使用动态库,只要动态库提供给该程序的接口没变,只要重新用新生成的动态库替换原来就可以了。

3. 甚至可以真正做到链接载入完全由程序员在程序代码中控制。

           程序员在编写程序的时候,可以明确的指明什么时候或者什么情况下,链接载入哪个动态链接库函数。“有需求才调入”的原则。 

4.由于静态库在编译的时候,就将库函数装载到程序中去了,而动态库函数必须在运行的时候才装载,所以程序执行的时候,用静态库更快些。

参考:静态链接库和动态链接库 

6.  C/C++编译原理

C/C++编译就是要将C/C++的代码映射到相应的机器码,以及讨论其中的内存管理模式,包括内存的分配,如何使用等等,整型、数组、指针等这些在内存中的实现机制。

C/C++的编译包括几个部分,分别是编译,汇编和链接。

    1. 编译,就是将相应的高级语言代码映射到汇编语言,处理define,include等命令,加载外部的代码;

    2. 汇编,就是将汇编语言映射到机器码;

    3. 链接,形成相应的动态和静态链接库。动态连接库是在程序运行时动态的加载,静态连接库是直接拷贝进入程序,在程序执行时,这些静态连接库加载进来。

         静态链接库不同于动态链接库(*.dll),在静态库情况下,函数和数据被编译进一个二进制文件(通常扩展名为*.LIB),Visual C++的编译器在链接过程中将从静态库中恢复这些函数和数据并把他们和应用程序中的其他模块组合在一起生成可执行文件。这个过程称为"静态链接",此时因为应用程序所需的全部内容都是从库中复制了出来,所以静态库本身并不需要与可执行文件一起发行。

         备注:静态库在程序的发行时是不需要发布库的, 因为静态链接就是将程序所需的所有程序直接拷贝到程序中来。

         在应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在连接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中。这种库称为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。为了克服这个缺点可以采用动态连接库。这个时候连接器仅仅是在可执行文件中打上标志,说明需要使用哪些动态连接库;当运行程序时,加载器根据这些标志把所需的动态连接库加载到内存

         备注:动态库,肯定需要将程序与动态库一起发布,这样就可以减少程序的大小。

参考:C/C++编译原理


7.  windows环境变量

参考:windows环境变量

7.1. 所有的在cmd命令行下对环境变量的修改只对当前窗口有效,不是永久性的修改。

 也就是说当关闭此cmd命令行窗口后,将不再起作用。永久性修改环境变量的方法有两种:一种是直接修改注册表(此种方法目前没试验过),另一种是通过我的电脑-〉属性-〉高级,来设置系统的环境变量(查看详细)。

7.2. 环境变量的作用。
 它是操作系统用来指定运行环境的一些参数。比如临时文件夹位置和系统文件夹位置等。当你运行某些程序时,除了在当前文件夹中寻找外,
还会到这些环境变量中去查找,比如“Path”就是一个变量,里面存储了一些常用的命令所存放的目录路径。
7.3. 什么情况下进行设置?
当启动cmd命令行窗口调用某一命令的时候,经常会出现“xxx不是内部或外部命令,也不是可运行的程序或批处理文件”,如果你的拼写没有错误,
同时计算机中确实存在这个程序,那么出现这个提示就是你的path变量没有设置正确,因为你的path路径,也就是默认路径里没有你的程序,
同时你有没有给出你程序的绝对路径(因为你只是输入了命令或程序的名称而已),这是操作系统不知道去哪儿找你的程序,就会提示这个问题。
7.4. 如何修改?
1、查看当前所有可用的环境变量:输入 set 即可查看。
2、查看某个环境变量:输入 “set 变量名”即可,比如想查看path变量的值,即输入 set path
3、修改环境变量 :输入 “set 变量名=变量内容”即可,比如将path设置为“d:\nmake.exe”,只要输入set path="d:\nmake.exe"。
注意,此修改环境变量是指用现在的内容去覆盖以前的内容,并不是追加。比如当我设置了上面的path路径之后,如果我再重新输入set path="c",再次查看path路径的时候,其值为“c:”,而不是“d:\nmake.exe”;“c”。
4、设置为空:如果想将某一变量设置为空,输入“set 变量名=”即可。如“set path=” 那么查看path的时候就为空。注意,上面已经说了,只在当前命令行窗口起作用。因此查看path的时候不要去右击“我的电脑”——“属性”........
5、给变量追加内容(不同于3,那个是覆盖):输入“set 变量名=%变量名%;变量内容”。如,为path添加一个新的路径,
输入“ set path=%path%;d:\nmake.exe”即可将d:\nmake.exe添加到path中,再次执行"set path=%path%;c:",
那么,使用set path语句来查看的时候,将会有:d:\nmake.exe;c:,而不是像第3步中的只有c:。
set PATH=%PATH%;C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib;C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin;C:\Program Files\Microsoft SDKs\Windows\v6.0A\include</p>set INCLUDE=%INCLUDE%;C:\Program Files\Microsoft SDKs\Windows\v6.0A\include

set LIB=%LIB%;C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib
set LIB=C:\Program Files\Microsoft XML Parser SDK\lib;C:\Program Files\Microsoft Platform SDK\lib\;C:\Program Files\Microsoft Visual Studio\VC98\mfc\lib;C:\Program Files\Microsoft Visual Studio\VC98\lib

set PATH=%PATH%;C:\Program Files\Microsoft Visual Studio\Common\Tools; C:\Program Files\Microsoft Visual Studio\Common\Tools\WinNT; C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin; C:\Program Files\Microsoft Visual Studio\VC98\bin

set INCLUDE=C:\Program Files\Microsoft XML Parser SDK\Inc; C:\Program Files\Microsoft SDK\Include\; C:\Program Files\Microsoft Visual Studio\VC98\atl\include; C:\Program Files\Microsoft Visual Studio\VC98\mfc\include; C:\Program Files\Microsoft Visual Studio\VC98\include

 
附录:下面贴上一些常用的环境变量及作用
    %ALLUSERSPROFILE% 局部 返回所有“用户配置文件”的位置。
  %APPDATA% 局部 返回默认情况下应用程序存储数据的位置。
  %CD% 局部 返回当前目录字符串。
  %CMDCMDLINE% 局部 返回用来启动当前的 Cmd.exe 的准确命令行。
  %CMDEXTVERSION% 系统 返回当前的“命令处理程序扩展”的版本号。
  %COMPUTERNAME% 系统 返回计算机的名称。
  %COMSPEC% 系统 返回命令行解释器可执行程序的准确路径。
  %DATE% 系统 返回当前日期。使用与 date /t 命令相同的格式。由 Cmd.exe 生成。有关 date 命令的详细信息,请参阅 Date。
  %ERRORLEVEL% 系统 返回最近使用过的命令的错误代码。通常用非零值表示错误。
  %HOMEDRIVE% 系统 返回连接到用户主目录的本地工作站驱动器号。基于主目录值的设置。用户主目录是在“本地用户和组”中指定的。
  %HOMEPATH% 系统 返回用户主目录的完整路径。基于主目录值的设置。用户主目录是在“本地用户和组”中指定的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值