此款IDE在windows桌面平台非常好用,集合了编译器连接器和调试器,支持git扩展。更重要的是,社区版面对个人和开源项目是免费的,如下所示,一下简称VS。
授权方式是安装完Visual Studio登录微软账号授权即可,如下所示。
编译快捷键
工具—>选项—>键盘
项目编译,全编译如下所示。
安装tomato插件
工具—>扩展与更新,搜索tomato,如下所示
由于编译器的不同,需要新建VS工程,新建的工程可以在源工程文件目录下,不影响源代码。
如下所示,这是一个git+MinGW搭建的windows项目
删除新建工程后的示例文件,记住在属性项目属性选项中删除预编译头文件,如下所示。
在git过滤中添加过滤Debug文件
.gitignore
.vs/
Debug/
x64/
代码由于编译器的不同需要进行修改。
1、VS对GCC的标识符不支持,如下所示,不支持_attribute_ 机制
修改方法:
使用以下对齐方式
#pragma pack(4) //添加对齐方式
#pragma pack() //回复对齐状态
2、VS需要更高的安全函数,如下所示,GCC下使用sprintf编译没有问题,但用到VS2017就会报错,提示使用更安全的sprintf_s。
修改方法:
1、 换成更安全的sprintf_s函数,但因为GCC不支持,在linux下无法使用,失去代码的可移植性。
2、 换成标准函数snprintf,VS和GCC都支持。
在工程属性—>常规中设置,如下所示
VS2017编译的静态库后缀为.lib,动态库文件后缀为.dll。
同样删除示例文件和去掉预编译头文件,将源码以及头文件包含进来,如下所示。
方法和编译成静态库一样,新建的工程为动态库工程。
也可以修改静态库的工程,输出更改成动态库,如下所示。
源文件引用动态库进行编译时需要添加这个动态库的lib导入库,不然会导致无法连接解析库文件,如下所示。
为需要导出的函数添加VS的关键字描述:__declspec(dllimport)
#ifdef __cplusplus
extern "C" {
#endif
#ifndef OBJ_DLL_API
#ifdef _WIN32
#define OBJ_DLL_API __declspec(dllimport)
#else
#define OBJ_DLL_API
#endif
#endif
OBJ_DLL_API int open_module1_func(void);
OBJ_DLL_API int open_module2_func(void);
#ifdef __cplusplus
}
#endif
通过宏_WIN32控制程序,使代码可以移植到Linux下。
编译成功,如下所示,输出路径已经改变。
之后过程输出的静态库和动态库都放到工程文件的输出文件夹中。
由于是在不同的项目中,因此需要引用库文件的工程添加库文件的头文件,如下所示。
若库文件工程就在解决方案中,直接引用该项目工程即可,如下所示。
若引用外部的dll,下章描述需要添加dll的环境。
编译成功,如下所示
以上示例适合引用静态库,动态库的引用需要多一步,将动态库dll的输出文件与工程文件exe的输出文件放置在同一级别文件夹下。
借助VS编译工具调试器,可以指定dll的路径,即dll放置在指定文件夹下,通过配置VS工具调试器的运行环境达到调用dll的效果。
若没有改变库文件的输出位置到解决方案指定的输出目录obj下,没有配置环境会导致程序找不到dll,如下所示。
VS调试器引用dll路径,如下所示。
输入形式:PATH=dll路径;
多个路径用英文的“;”间隔。
运行模式是指程序编译好后不依赖VS工程启动,直接运行exe文件,这时就用不了VS调试模式配置的环境变量,只能用电脑的环境变量或直接调用exe同级目录下的dll。没有配置环境会导致程序找不到dll,如下所示。
解决方法:
1、 直接将dll放到exe文件夹下。
2、 将dll路径加载到电脑的环境变量Path中。
应要程序去适应电脑,所以直接将dll放到exe执行程序下,运行如下所示。
直接运行exe程序需要在main函数末尾加上while(1);