今天上午在鼓捣一个地图绘图程序,程序写到一半,在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. 单元测试之Mock

    为什么需要Mock. 真实对象具有不确定的行为.所以会产生不可预测的结果. 真实对象很难被创建. 真实对象的某些行为很难被触发(如网络错误). 真实对象令程序的运行速度很慢. 真实对象有(或者是)用户 ...

  2. 关于出现Failed to instantiate SLF4J LoggerFactory问题原因,解决办法

    在创建spring boot 文档进行配置的时候,因为使用spring boot 父级依赖的版本 <artifactId>spring-boot-starter-parent</ar ...

  3. Oracle"TNS监听程序找不到符合协议堆栈要求的可用处理程序"解决方案

    问题描述:在使用ETL工具通过odbc方式连接Oracle进行数据抽取的过程中,Oracle 监听日志报错如下: 根本原因就是Oracle的process和session已经达到了甚至超过了最大值,解 ...

  4. 【技术累积】【点】【java】【1】JSONPath

    闲聊 以后周中每天一篇这种偏短的文章,周末就发长一点的文章,不然自己实在是懒,懒成了习惯了... 开始 首先需要明确的是,这里说的是阿里巴巴的fastjson包中的JSONPath,不是jsonPat ...

  5. strusts2_json

    引用别人的 Struts.xml <package name="default" extends ="json-default" > <act ...

  6. 添加图标:before 和 :after css中用法

    #sTitle:after{ position: absolute; top: 2px; font-family: "FontAwesome"; content: "\f ...

  7. .apply .call方法的区别及使用 .apply第二个参数为数组,.call第二个参数为参数列表, 相同点:第一个参数都为Function函数内部的this对象.

    Function.apply(obj,args)方法能接收两个参数 obj:这个对象将代替Function类里this对象 args:这个是数组,它将作为参数传给Function(args--> ...

  8. chrome中自动回填表单解决

    input添加属性autocomplete="new-password"

  9. vs code格式化代码快捷键

    windows:shift+alt+F ubuntu: ctrl+shift+i

  10. iOS runLoop 原理多线程 总结 NSTimer优化

    可以理解为字面意思:Run 表示运行,Loop 表示循环.结合在一起就是运行的循环的意思.哈哈,我更愿意翻译为『跑圈』.直观理解就像是不停的跑圈. RunLoop 实际上是一个对象,这个对象在循环中用 ...