【外部库在win10+vscode下的配置】

今天在win10+vscode下配置CG环境opencv+eigen库时,遇到了一些问题,通过解决这些问题总结出来一些经验。

一、opencv的配置

首先从opencv官网下载源代码文件,接着在build文件夹里对根目录使用cmake命令(或者使用gui的configure+generate两步,和cmake命令是等价的),创建出Makefile文件,然后使用minGW32-make install命令进行编译安装,接着配置环境变量,至此,opencv在本机上的安装已经完成。
然后修改vscode中的各个json文件,各个文件的作用分别是:

二、.vscode文件夹内各个json文件及关键参数的作用

tasks.json:最重要的json文件,相当于集成了多条命令行命令的脚本,可以把它的作用看做“生成目标文件(比如exe)”。
launch.json:用来在vscode中运行exe文件,和快捷键F5绑定,注意 launch不一定是调试也可以是运行,这取决于“type”的值。
c_cpp_properties.json:用来在vscode里面提示语法错误或者高亮显示的插件配置文件,和编译运行等关键过程无关(来源于网络),不是关键文件
setting.json:插件runner的配置文件,不太了解

三、外部库

首先搞清楚什么是库,库可以分为用户级别的和系统级别的,一般涉及到系统调用的库(如opencv)就需要在编译的基础上再进行安装install(可以理解为,既然有系统调用,要和系统打交道,那就需要安插一些文件在系统路径或者和系统文件建立某种联系),但是普通的用户级别的库(如Eigen),和我们在工程中自己创建的.h文件并无区别,则只需要编译即可。
另外Eigen的情况比较特殊,即在下载完源代码以后不需要再进行提前编译出静态库或动态库,只需要把路径加到tasks.json文件里面就可以,这是因为Eigen比较简单,所以它的实现全部集成在.h文件里面,没有.cpp文件也就不需要再分开编译,只需要#include进main.cpp里面和main.cpp进行统一编译即可

四、如何让编写的程序运行在他人没有编译环境的电脑上

这是一直以来困扰我的一个问题,因为特别想做一个程序发给女朋友让她运行,但是网络上关于这个问题的资料却很少,很长一段时间内我都不知道到底应该怎么做,今天有了新的思路。
首先exe是可执行文件,本质是一堆可以直接执行的二进制代码,但是这些代码的直接执行者并非硬件而是操作系统。否则即使是CPU的架构稍有不同则程序便无法一直运行,这是不可能的。因此某个确定的二进制exe文件可以在几乎所有较新的windows操作系统下运行,这是程序移植运行的基础保障。使用mingw套件下的gcc和g++就可以生成exe,因为mingw对应的就是windows系统,linux版本的gcc和g++生成的就是linux下的可执行文件,总结来说就是各版本g++之间也有不同。
然后就是最重要的库的问题,库分为内部库外部库,即.h文件和.cpp文件在不在编译器(如g++)的默认路径里,如果是内部库,在cmd里g++时(或者在等价的tasks.json里)就不需要在用-I命令和-L,-l命令显式指出库的位置,如标准输入输出库iostream,但如果是外部库则需要显式指出库的位置。另外关于在include的时候用尖括号<>还是双引号“”并不取决于内部外部库,而是取决于被include的头文件到底在设置好的-I的list中列出的搜索路径中(使用尖括号),还是只在当前.cpp的同根相对路径中(使用双引号),举个例子:虽然opencv是外部库(不像iostream一样在g++默认路径里),但是如果在编译时加上-I命令指出opencv的位置以后,引入头文件依然可以使用尖括号<>。但是库的内部性和外部性依然不是决定程序移植性的关键指标,因为这影响的仅仅是编译阶段,而非执行阶段
真正影响exe在同操作系统平台下能否移植运行的关键因素是:库是用户级还是系统级
如果是用户级的库,只需要在工程文件包里复制一份,然后修改一下编译时的路径参数,再编译出来的exe就可以移植运行,比如Eigen库。
如果是系统级的库,则必须在目标电脑上提前进行安装,这或许需要新的知识的支持,现在还不会操作。比如要在一个新电脑上支持使用opencv的exe则必须提前安装opencv库,把相关的dll文件存入System32文件夹中

五、cmake-gui使用

如果要用cmake-gui来编译一个.h和.cpp分离的较复杂外部库,需要这么操作:
首先在下面输入源代码路径
在这里插入图片描述
然后这里输入空文件夹build路径
在这里插入图片描述

反复configure到主界面没有红色为止,然后generate生成Makefile文件,configure的时候编译器一定要和工程项目使用同一个!!!不然后续链接的时候会匹配不上

六、cmake、vscode的json、vs的project

这三者在层次上都是等价的,都属于编译的上层,即对于复杂的编译命令进行集成处理,但并没有编译的功能。因此三者挑一个用就行,比如使用CMakeLists.txt的时候就没有必要再配置vscode的json文件,反过来也是一样

你可能感兴趣的:(vscode,ide,编辑器)