由mitab学到一些关于编译和运行的理解
今天上午在鼓捣一个地图绘图程序,程序写到一半,在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文件,将百度到的结果放在这里,便于以后查看啦,一下是两个链接:
动态链接库->http://baike.baidu.com/view/887.htm?fr=aladdin
由mitab学到一些关于编译和运行的理解的更多相关文章
- [JAVA] 一个可以编辑、编译、运行Java简单文件的记事本java实现
本来是Java课做一个仿windows记事本的实验,后来突然脑子一热,结果就给它加了一个编译运行Java文件的功能. 本工程总共大约3000行代码,基本上把所学的java界面.文件.控件的功能都包含在 ...
- notepad++编译并运行java (自定义包)
最近用Notepad++写汇编,感觉用起来挺顺手,于是想能不能也在这个优秀的编辑器下编写java并编译运行呢,因为每次启动eclipse都要挺长时间,而且eclipse实在太占内存了... 于是各种百 ...
- 手动编译并运行Java项目的过程
现在Java开发基本上就是IDE调试,如果跨平台打个jar包过去运行一般就可以了,但是有些情况比如需要引入外部依赖的时候,这个时候是不能直接运行的,还需要引入一些外部的参数,并不是简单的javac和j ...
- 如何使用命令行编译以及运行java文件
要想编译和运行java文件,很简单,只需要两个命令: (1) javac:作用:编译java文件:使用方法: javac Hello.java ,如果不出错的话,在与Hello.java 同一目录下会 ...
- .NET程序的编译和运行
程序的编译和运行,总得来说大体是:首先写好的程序是源代码,然后编译器编译为本地机器语言,最后在本地操作系统运行. 下图为传统代码编译运行过程: .NET的编译和运行过程与之类似,首先编写好的源代码,然 ...
- Java程序编译和运行的过程
Java整个编译以及运行的过程相当繁琐,本文通过一个简单的程序来简单的说明整个流程. 如下图,Java程序从源文件创建到程序运行要经过两大步骤:1.源文件由编译器编译成字节码(ByteCode) 2 ...
- Java程序编译和运行的过程【转】
转自:http://www.360doc.com/content/14/0218/23/9440338_353675002.shtml Java整个编译以及运行的过程相当繁琐,本文通过一个简单的程序来 ...
- .NET概念:.NET程序编译和运行
.NET概念:.NET程序编译和运行 分类: c#程序设计 2012-02-29 15:46 3001人阅读 评论(2) 收藏 举报 .net编译器语言microsoftassemblyvb.net ...
- Xcode常见的编译、运行等错误的解决
Xcode常见的编译.运行等错误的解决 项目没找到Info.plist的错误 The solution for this particular instance of the error was “I ...
随机推荐
- (转)Webpack2 + Vue2 + Vue-Router2 如何实现懒加载?
webpack2 的中 System.import 方法将被弃用, 推荐改成以下写法: https://www.mmxiaowu.com/article/5848239bd4352863efb5546 ...
- Android WiFi热点完全研究(自定义创建、跳转系统界面设置、读取配置、切换,Android6.0适配)
前言: WiFi热点设置页面的安全性选项在Android 4.x上有“无”.“WPA PSK”.“WPA2 PSK”三个选项,在Android 5.0(含)之后去掉了WPA PSK选项(部分手机厂家会 ...
- Linker scripts之SECTIONS
1 Purpose The linker script describes how the sections in the input files should be mapped into the ...
- winform右键菜单
public partial class Form1 : Form { ContextMenuStrip cms; Bitmap bm ; public Form1() { InitializeCom ...
- 使用QT的一些小Tipster
1.在使用Qt Creator编程时,难免会用到将float类型转换为QString类型的方法:原文 1.1. 将QString类型转化为float类型,很简单 QString data; ...
- gulp打包压缩代码以及图片
1.首先全局安装gulp 全局安装就不做介绍了 初学gulp,终于把常用的配置,api,语法弄明白了! gulp插件地址:http://gulpjs.com/plugins gulp官方网址:http ...
- PuTTY 命令行改进 有效解决 中文乱码
PuTTY 是一个免费且跨平台的并支持SSH和Telnet 的客户端, 包括xterm 终端模拟器. 它由Simon Tatham 编写并维护. http://www.chiark.greenend ...
- IIS访问php页面问题,报告404错误
IIS访问php页面出现问题,所有php页面找不到,显示404页面,html页面可以正常访问. 搜索结果: 方案1: 打开WEB服务扩展,把“所有未知ISAPI扩展”设为允许! 方案2: PHP没有完 ...
- gitlab安装和汉化
Centos 7.x 安装 gitlab-ce-8.8.0-ce 一.安装配置依赖项 yum -y install curl unzip policycoreutils git wget # 依赖包 ...
- 关于TCP中对于ACK报文是否需要确认的理解
首先,TCP是一个面向字节流的协议,它不会对自己的内容做出任何的解释,也不需要做出解释,具体的解释由上层的协议来处理. 其次,TCP是一个面向字节流的协议,它会对它发送的每一个字节负责,确保每一个字节 ...