从cmake到VS2017编译一个项目遇到的一系列问题

这是一个断断续续持续了一个月的过程,我先来讲一下背景,我们老师买了一个声呐,他有配套的软件和sdk,结果我看了一个礼拜的代码,最后跟我说sdk更新了,我简直说不出话来…这个项目是基于qt和opengl编写的,我对这两个仅停留于知道名字的阶段,而且只会C语言以及忘了差不多的c++,由于篇幅所限,这里就不详细展开qt和opengl的相关知识,这一个月里这个看一点那个看一点恶补了很多知识,而且零零碎碎的基本上成不了系统,在编译的时候出现了各种bug,而且网上的解决方案五花八门,也不一定对你有用,经过我一个月的摸索,这里总结一下我的个人经验,希望能对遇到同样困扰的你们有所帮助。

一、一个SDK包的基本目录

厂家给我的sdk下面的目录长这样
在这里插入图片描述

1. bin文件夹:

下面是各种编译完成的可以直接运行的.exe可执行文件以及依赖的.dll文件,你可以直接运行exe文件,大概就是长这样,
在这里插入图片描述

2.doc文件夹

这个文件夹下装的是一个参考文档,一般都是关于库使用的一些说明文档
在这里插入图片描述

3.include文件夹

这个文件夹装的是各种头文件,可能里面还会细分不同的文件夹
在这里插入图片描述

4.libs文件夹

这个文件夹下的是库文件,包含lib和dll文件,这里包含的是动态链接库(下面会介绍)
在这里插入图片描述

5.src文件夹

这个文件夹下装的就是各个源文件了,你可以根据自己的需求去修改代码并进行二次开发

在这里插入图片描述
每个源文件夹下面类似下面的cmakelist的项目,你需要先cmake将他变成一个你熟悉的vs项目这个后面介绍,icons是一些资源文件。
在这里插入图片描述

6.cmakelist.txt

这个cmakelist.txt是主配置文件,它与src下的cmakelist文件成父子关系。你需要大概读懂它,对于其中一些设置要知道他为甚么这样设置,这个记事本很重要

二、how to cmake

当看完整个SDK的结构目录后,我们必然想要去将一个src源文件下的各种cpp打包成我们熟知的VS项目,首先你需要去了解一下cmake的语法以及他如何编译文件的,如果你这个还不太清楚的话,建议你看一下另一篇博客
https://blog.csdn.net/afei__/article/details/81201039

看完这篇博客后,你会对cmake的编译有一个新的认识,当你了解知道了cmakelist都在写什么后,就可以开始编译文件了
1.ctrl+r输入cmd进入命令窗口执行

C:\Program Files (x86)\Microsoft Visual
Studio\2017\Professional\VC\Auxiliary\Build\vcvars32.bat

2.创建一个文件夹用来存放生成的项目

 mkdir c:\work\tritetchsdk

3.跳转到该文件夹

cd c:\work\tritetchsdk\

4.cmake

cmake -G"Visual Studio 15" -DARCH=x64 -DCMAKE_BUILD_TYPE=Release 
"C:\Program Files (x86)\Tritech\Gemini SDK"
cmake -G < generator-name >指定一个makefile生成工具。
      -DARCH=指定运行平台
      -DCMAKE_BUILD_TYPE=指定运行方式

更多内容可以参考https://www.cnblogs.com/coderfenghc/tag/cmake/

三、这里要搞懂四个概念:动态库,静态库,动态链接,静态链接

首先静态链接是指链接器从静态链接库中获取所有被引用的函数,静态链接可以链接静态库和动态库,也就是说静态链接库可以是静态库或动态库

动态链接是指链接器链接器根据需求定位到动态链接库指定的位置,不需要获取所有被引用的函数,动态链接库只能是动态库

2.接下来介绍什么是静态库和动态库

我们都知道一个库是函数的集合体,静态库生成的只有一个.lib文件,lib文件里包含了所有函数的实现,动态库则包含两个文件,.lib和.dll文件,其中dll文件中包含了实际的执行代码,也就是函数的实现,而这里的lib文件包含的只是地址符号表等,确保程序找到对应函数的一些基本地址信息,它相当于一个接口,让主程序通过lib文件能找到dll文件。

目前以lib后缀的库有两种,一种为静态链接库(Static Libary,以下简称“静态库”),另一种为动态连接库(DLL,以下简称“动态库”)的导入库(Import Libary,以下简称“导入库”)

3.动态库和静态库优缺点

静态库优点

静态库是在编译的时候已经将库函数全部装载到程序中,运行速度快,不用在运行时去链接库,而且在别的计算机上使用只需要将可执行文件拷贝过去就可以运行了。

静态库缺点

静态库是在编译的时候已经将库函数全部装载到程序中了,会导致生成的程序非常大,如果你需要修改库函数的代码时,你需要重新编译文件,这时候你的项目很大的话,就会花费长时间的编译时间。

动态库优点
动态库在编译的时候只将lib文件装载到程序中,运行时才会链接dll文件,所以当你需要update库时,只需要将最新版的库更换上去就好了,不用进行重新编译

动态库缺点
当在别的计算机上使用时,需要将dll文件也打包过去,不然会出现找不到dll入口的问题

总的来说它们各有优缺点,请根据自己的实际需求来配置

4.动态链接和静态链接优缺点

静态链接优缺点
静态链接是将lib文件全部导入到程序中,所占的内存比较大

动态链接优缺点
动态链接是将只需要的部分导入到程序中,所占内存比较小

5.VS导入第三方库

1.首先在菜单栏的项目下选择属性
在这里插入图片描述
2.在最上面选择自己需要的配置和平台,这个配置的是解决方案的配置,要与下图的配置一致,嫌麻烦可以选择所有配置和所有平台。选择c/c++的常规,在附加包含目录中添加include头文件,可以是绝对路径也有可能是相对路径。在这里插入图片描述

在这里插入图片描述
3.在链接器常规中选择附加库目录,在这里加入lib文件路径,可以是绝对路径也有可能是相对路径。
在这里插入图片描述

4.在链接器常规中选择附加依赖项,在这里加入lib文件名
在这里插入图片描述

如果是静态库,这样就导入完成了,如果是动态库,则还需要将dll文件放在编译成功的可执行程序的同一文件夹下

四、VS编译时遇到的问题和解决方案

1.模块计算机类型“X86”与目标计算机类型“X64”冲突

或者模块计算机类型“x64”与目标计算机类型“x86”冲突

这里的模块计算机类型值得时计算机当前调用库的位数,x86指的是32位,x64指的是64位,目标计算机类型是指当前的编译平台环境,也就是VS工具栏上的可选项,如果两者不符合,就会产生冲突。

解决方案
只要把模块计算机类型和目标计算机类型改成一致就行了,如果是x86,就选行就好了,大概流程是:

1、“链接器-》高级-》目标计算机”设置为"MachineX64 (/MACHINE:X64)"
2、“链接器-》命令行-》其他选项”设置为" /machine:X64 /debug "
3、“生成-》配置管理器-》活动解决方案平台”设置为" X64 ",如果没有就新建。

2.win32和x86以及x64的区别

win32指所有的32bit的平台,而x86仅仅是指Intel和AMD的32位平台
比如32bit的ARM平台,就包含在win32中,不在x86的范围中
x64指的是Intel和AMD的64位平台

3.无法解析外部符号XXXXXXXX

这肯定是因为你的库没有导入好,只要根据上面的一步步来就不会报这个问题。

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值