今天上午在鼓捣一个地图绘图程序,程序写到一半,在windows下写不下去了,原因是需要引入的第三方的mitab类库进行.mif文件的读写操作,而这个类库的windows下的.lib文件和.dll文件都是在32位的机器下面编译生成的,我用的是i5的CPU的联想小Y,当然是64位的咯,也不想为写个这么小的程序装32位操作系统,于是鼓捣着在windows 64位系统下搞定这个,可能是以前的编译和运行的知识不够扎实吧,今天通过这么一倒腾倒是对几种文件有了新的理解,先来简述一下mitab这个读写地图文件的第三方类库吧,它的文件包里面有两个Makefile,一个是GNUmakefile,另一个是makefile.vc,由名字就可以看出来,分别对应Linux操作系统下面的GCC编译器和VC++编译器,首先来讲在Linux下的编译与运行过程吧,在Linux下编译的动态链接库为.so文件结尾,Linux编译mitab的动态链接库较为简单,按照文档里面说的,直接make -f GNUmakefile就会得到三个.so的文件分别是libmitab.so, libmitab.so.1和libmitab.so.1.0.1,这三个文件都是我们需要的,现在重点来了,在Linux下面,Qt Creator里面如果要使用这些API,那么步骤如下,需要在.pro工程文件中加入如下配置代码: unix: LIBS += ./libs/libmitab.so(另外两个省略),然后再设置你的LD_LIBRARY_PATH, 把包含这些.so文件的路径加进去,这可以通过在shell中通过export的方法实现,也可以在Qt Creator的Run和Build的设置中,将环境变量里的LD_LIBRARY_PATH添加该路径,将所有需要的头文件都放到一个叫做header的文件里,将mitab.h和mitab_capi.h包含进工程文件即可了,注意,在linux下面和Windows下不同,编译的时候需要使用到libmitab.so(另外两个也要,这里省略),运行时候也要。这样文件就能够顺利通过编译和运行了,为了方便,我的做法是这样子的,我建了/usr/local/lib/mitab这么一个目录,将三个链接文件放到这里面,然后配置Qt Creator的LD_LIBRARY_PATH到这里,那么一切都easy了,运行编译两不误。

再来讲讲纠结的windows 8下的mitab编译和运行吧,和Linux下不同,windows下编译的时候需要用到.lib文件,而运行的时候需要用到.dll文件,由于我电脑是64位的,而mitab根据文档描述需要用到VC++ 6.0的编译器进行编译,这肯定不行啊,已经过时了的VC++ 6.0当然是装不到64位操作系统上的咯,那咋办,于是我想了个办法,既然32位下编译的.lib文件我肯定是跑不起来的了,那有没有针对于64操作系统写的nmake编译器呢,google了半天,结果在微软社区上看到了可以在Visual studio 2010下找到nmake,而且是64位的,天啦,太棒了,于是毫不犹豫装了个Visual Studio 2010, 然后找到VC的bin目录,注意这里编译的时候一定要先配置好环境变量,这一切都是通过这个bin文件夹下面的vcvars32.bat来设置的,一定要开启一个cmd后运行,不然是无效的如果正常,到文件目录下执行nmake -f makefile.vc将得到4个.lib文件和一个mitab.dll文件。.lib文件和编译相关,在windows下Qt Creator需要设置.pro文件,加入四行如win32: LIBS += ./libs/mitab.lib(另外三个省略),这样就可以通过编译了,注意这只能通过编译,要想执行,一定要将.dll文件放到生成的.exe中去。到此,一切都结束了,可以开始干接下来的活了。

  为了更好的理解.so、.lib、.dll文件,将百度到的结果放在这里,便于以后查看啦,一下是两个链接:

  .lib文件->http://baike.baidu.com/link?url=FyqRptRBgvwa5WZNsBQnX7SNQk5rSls_Ea6Zptl4AvQzCzkgFeGn5LVdnEPRgYSLMlCaSltZWUpVCpain0Ax3_

  动态链接库->http://baike.baidu.com/view/887.htm?fr=aladdin

  

  

由mitab学到一些关于编译和运行的理解的更多相关文章

  1. [JAVA] 一个可以编辑、编译、运行Java简单文件的记事本java实现

    本来是Java课做一个仿windows记事本的实验,后来突然脑子一热,结果就给它加了一个编译运行Java文件的功能. 本工程总共大约3000行代码,基本上把所学的java界面.文件.控件的功能都包含在 ...

  2. notepad++编译并运行java (自定义包)

    最近用Notepad++写汇编,感觉用起来挺顺手,于是想能不能也在这个优秀的编辑器下编写java并编译运行呢,因为每次启动eclipse都要挺长时间,而且eclipse实在太占内存了... 于是各种百 ...

  3. 手动编译并运行Java项目的过程

    现在Java开发基本上就是IDE调试,如果跨平台打个jar包过去运行一般就可以了,但是有些情况比如需要引入外部依赖的时候,这个时候是不能直接运行的,还需要引入一些外部的参数,并不是简单的javac和j ...

  4. 如何使用命令行编译以及运行java文件

    要想编译和运行java文件,很简单,只需要两个命令: (1) javac:作用:编译java文件:使用方法: javac Hello.java ,如果不出错的话,在与Hello.java 同一目录下会 ...

  5. .NET程序的编译和运行

    程序的编译和运行,总得来说大体是:首先写好的程序是源代码,然后编译器编译为本地机器语言,最后在本地操作系统运行. 下图为传统代码编译运行过程: .NET的编译和运行过程与之类似,首先编写好的源代码,然 ...

  6. Java程序编译和运行的过程

    Java整个编译以及运行的过程相当繁琐,本文通过一个简单的程序来简单的说明整个流程. 如下图,Java程序从源文件创建到程序运行要经过两大步骤:1.源文件由编译器编译成字节码(ByteCode)  2 ...

  7. Java程序编译和运行的过程【转】

    转自:http://www.360doc.com/content/14/0218/23/9440338_353675002.shtml Java整个编译以及运行的过程相当繁琐,本文通过一个简单的程序来 ...

  8. .NET概念:.NET程序编译和运行

    .NET概念:.NET程序编译和运行 分类: c#程序设计 2012-02-29 15:46 3001人阅读 评论(2) 收藏 举报 .net编译器语言microsoftassemblyvb.net ...

  9. Xcode常见的编译、运行等错误的解决

    Xcode常见的编译.运行等错误的解决 项目没找到Info.plist的错误 The solution for this particular instance of the error was “I ...

随机推荐

  1. MessageDigest的功能及用法(加密解密)

    MessageDigest的功能及用法 MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法.信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度 ...

  2. 6.Renderer Window

    渲染是实时的,所见即所得.同时还可以输出一些统计信息. Pixel Snoop:获取颜色值,同时把该值复制到剪贴板,主要用户是获取颜色值 Wireframe:开启后可以查看3D节点图形骨架 Stati ...

  3. 关于H5移动端开发 iPhone X适配

    一. 媒体查询. @media screen and (device-width:375px) and (device-height:812px){ #header { height: 88px; p ...

  4. Spring 获取propertise文件中的值

    Spring 获取propertise文件中的值 Spring 获取propertise的方式,除了之前的博文提到的使用@value的注解注入之外,还可以通过编码的方式获取,这里主要说的是要使用Emb ...

  5. mysql Seconds_Behind_Master

    通过show slave status查看到的Seconds_Behind_Master,从字面上来看,他是slave落后master的秒数,一般情况下,也确实这样,通过Seconds_Behind_ ...

  6. js页面传值,cookie

    // 获取页面穿值 function GetQueryString(name) { var reg = new RegExp("(^|&)" + name + " ...

  7. 为什么java io流必须得关闭

    当我们new一个java流对象之后,不仅在计算机内存中创建了一个相应类的实例对象.而且,还占用了相应的系统资源,比如:文件句柄.端口.数据库连接等.在内存中的实例对象,当没有引用指向的时候,java垃 ...

  8. Project Euler 15 Lattice paths

    题意:在20×20方阵中从起点出发只允许向右或向下移动到达终点的路径有多少条. 思路:每次只能向右或者向下,总共 40 步,也就是 40 步中每一步都有两种选择,也就是 C (40 , 20) . 为 ...

  9. Redis 报错:MISCONF Redis is configured to save RDB snapshots

    MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Com ...

  10. [LeetCode] 75. 颜色分类(荷兰国旗)

    class Solution { public: void sortColors(vector<int>& nums) { ,current=,end=nums.size()-; ...