在vs2012上配置vtk的一波三折的历程 及cmake的使用小结

最近配置vtk,走了很多弯路,当然也学到了很多东西,且行且记。下面是安装和配置的步骤:

  1. 下载,vtk-source,vtk安装包(暂时没用到,先安上),vtk-data(同左),cmake安装包;
  2. 安装vtk安装包和cmake安装包;
  3. 解压vtk-source到如c:/vtk/vtk6.0,新建一个文件夹c:/vtk/bin放置生成的vtk VS2012工程;
  4. 点开cmake-gui,c:/vtk/vtk6.0作为source,c:/vtk/bin作为build目标,然后点击cofigure,选择编译器,注意编译器要选择好,比如我就选错了,结果编了个64位的工程,结果导致我新建的win32工程各种出错。
  5. 选择生成配置,建议选择上BUILD_EXAMPLES和BUILD_TESTING,这2个选项可以生成示例程序,选择BUILD_SHARED_LIBS可以生成共享的dll,如果不生成变只有静态链接库,那样程序占用的空间就会比较大。如果要使用mfc显示的话,选择Module_VTKGUISUPPORITMFC;这个时候如果点击生成就可能会出错,需要重新configure,直到结果没有红色,才可以点击生成。
  6. 点击/bin中的vtk.sln,打开vs工程,全部生成一遍,这个时候VTK就配准的差不多了,可以自己运行一个里面的例子学习一下。

一个解决方案这么多工程,总让我不是很清爽,所以是重新新建了一个解决方案。

配置vs 工程时要设置几个目录:

  1. 属性》vc目录》库目录,写上lib文件所在目录;
  2. 属性》c++》常规》外部引用目录,协商.h头文件所在目录
  3. 属性》连接器》输入》附加依赖项,写上需要的.lib文件名。
  4. 若需要用到dll动态链接库,则应该将这些dll加入到window》system文件夹中。

这上面的除了第4步自己找到.dll文件,然后放入system文件夹中。其他都可以参考cone例子程序中的设置,或者可以直接拷贝,拷贝的时候注意要把路径改正确。

关于第4步,我用的是64位系统,把dll放到system中就OK,放system32中会出找不到dll的情况。

到了这个时候可以写个小例子,但是发现可以编译运行但是运行的程序会出如“no override found for'vtkPolyDataMapper'的bug,

这个问题可以参考"http://www.vtk.org/Wiki/VTK/VTK_6_Migration/Factories_now_require_defines"中的最后一段,把cone例子中 属性》与处理器中的值直接拷贝过来。出错的原因是因为工程直接用本地编译器编译而不是用cmake创建,所以会有一些宏定义没有定义。

ps:

.dll 和 .lib件的区别:

dll动态链接库作用:含有函数的可执行代码

lib库有两种:

(1)静态链接库(Static Libary,以下简称“静态库”)

(2)动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”)

静态库本身就包含了实际执行代码、符号表等等,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息

如:当我们在自己的程序中引用了一个h头文件里的函数,链接器怎么知道该调用哪个DLL文件呢?

这就是导入库文件的作用:告诉链接器调用的函数在哪个DLL中,函数执行代码在DLL中的什么位置。这也就是为什么需要在工程属性的“附加依赖项”中填入.LIB文件,它起到桥梁的作用。如果生成静态库文件,则没有DLL ,只有lib,这时函数可执行代码部分也在lib文件中。

dll有两种加载方式:隐式链接和显式链接。

dll一般会有对应的导入库,方便程序进行隐式链接加载,否则就需要自己LoadLibary调入DLL文件,然后再GetProcAddress获得对应函数了(即显示链接加载dll方式)。有了导入库,你只需要链接导入库后按照头文件函数接口的声明调用函数就可以了。

即:隐式链接方式需要导入库,而显式链接方式可以不需要。

 

 .h头文件是编译时必须的,lib库是链接时需要的,dll动态链接库是运行时需要的。

若生成了DLL,则肯定也生成 LIB文件。如果要完成源代码的编译和链接,有头文件和lib就够了。如果也使动态连接的程序运行起来,有dll就够了。在开发和调试阶段,当然最好都有。





你可能感兴趣的:(在vs2012上配置vtk的一波三折的历程 及cmake的使用小结)