用Visual Studio 2019配置libgraphics图形库
- 前言
- 一、极简版(荐)
- 二、完整版
同步发布至:【Visual Studio+libgraphics库】用Visual Studio配置libgraphics图形库(vs2019使用libgraphics)
前言
最近在尝试用libgraphics这个图形库来进行项目的制作,但是据说这是一个非常古老的库,目前只了解到如何用DEVC++ 来配置libgraphics。但个人认为DEVC++ 编编单文件程序可以,如果文件一多还是很麻烦的,因此就想到了使用Visual Studio尝试一下配置libgraphics项目。
一、极简版(荐)
极简版将快速完成项目的配置,忽略了中间冗杂的找问题以及解决问题过程
说明
我是从完整版开始写的,心态写崩了,从完整版开始看吧
(懒得整理了
二、完整版
完整版将从头开始一步一步来,逐个解决报错,完成项目配置
1.创建空项目
①.打开Visual Studio
②创建新项目->空项目->配置新项目
2.配置项目文件
①将libgraphics库( “lib” 文件夹和 “libgraphics” 文件夹)移动至工作区内
②在Visual Studio内配置库
点击 “显示所有文件” 后会出现刚才导入的两个文件夹
在解决方案管理器内展开文件夹全选文件之后右键选择 “包括在项目中”
在项目上右键,添加->新建项
然后修改文件名(此处以"main.c"为文件名,可以修改,但是一定要注意的是必须为c语言文件,即以".c"结尾)
3.配置项目属性
修改完之后进入 VC++目录->包含目录->编辑 添加库引用
最后应用修改
4.编写样例程序
刚开始我觉得非常简单,我认为和在DEVC++中配置是大同小异的,但是实际并非如此!!!
解决了一个报错又出来有一个报错,因此我经历了非常痛苦的配置过程,网上的相关解决方案有相当的少。
因此我觉得有必要写一篇记录一下!
首先,先给出测试libgraphics图形库基本功能的代码。
代码如下:
/*
* File: main.c
* -------------
* This program verify the basic function of libgraphics
*/
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include "graphics.h"
#include "genlib.h"
#include "conio.h"
#include <windows.h>
#include <olectl.h>
#include <stdio.h>
#include <mmsystem.h>
#include <wingdi.h>
#include <ole2.h>
#include <ocidl.h>
#include <winuser.h>
/*function*/
void DrawBox(double x, double y, double width, double height);
void DrawTriangle(double x, double y, double base, double height);
void DrawCenteredCircle(double x, double y, double r);
void Main() {
InitGraphics();
double cx, cy;
cx = GetWindowWidth() / 2;
cy = GetWindowHeight() / 2;
SetWindowTitle("Test");
SetPenColor("Blue");
DrawBox(cx, cy, 2.0, 3.0);
SetPenColor("Red");
DrawCenteredCircle(cx, cy, 1.0);
SetPenColor("Orange");
DrawTriangle(cx, cy, 2.0, 1.7);
MovePen(cx, cy);
DrawTextString("Hello!!!");
}
void DrawBox(double x, double y, double width, double height) {
MovePen(x, y);
DrawLine(0, height);
DrawLine(width, 0);
DrawLine(0, -height);
DrawLine(-width, 0);
}
void DrawTriangle(double x, double y, double base, double height) {
MovePen(x, y);
DrawLine(base, 0);
DrawLine(-base / 2, height);
DrawLine(-base / 2, -height);
}
void DrawCenteredCircle(double x, double y, double r) {
MovePen(x + r, y);
DrawArc(r, 0, 360);
}
我们先不妨试着运行一下(一定是运行不了的!)
好,接下来让我们逐个解决问题
5.解决各种报错
①C4996:"This function or variable may be unsafe"报错
报错截图:
错误 C4996 ‘sprintf’: This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. LibGraphicsTest
报错原因:
上网查询资料之后,原因是目前Visual Studio使用了更加安全的 run-time library routines
因此这类函数要么改写为带"_s"的新形式,要么忽略这个报错。
解决方案:
①将所有这类函数替换为带"_s"的更安全的形式(不推荐,感觉有好多,挺麻烦的)
②在头部添加宏定义:#define _CRT_SECURE_NO_DEPRECATE
(不推荐,需要在每个文件中添加宏定义,挺麻烦的)
③在项目属性中忽略此类报错(推荐,具体方法如下)
单击项目右键进入属性页,进入 “ C/C++ -> 预处理器 -> 预处理器定义 ”
在预处理器定义中添加_CRT_SECURE_NO_WARNINGS
,然后点击 “确定”->“应用”
②LNK2019:无法解析的外部符号"main" 报错
报错截图:
错误 LNK2019 无法解析的外部符号 main,函数 “int __cdecl invoke_main(void)” (?invoke_main@@YAHXZ) 中引用了该符号 LibGraphicsTest
报错原因:
在使用libgraphics图形库编程时,我们要写的图形化界面
而项目默认的是控制台程序(console)
因此我们要将项目的属性从控制台程序修改图形化界面的窗口程序
解决方案:
单击项目右键进入属性页,进入 “ C/C++ -> 预处理器 -> 预处理器定义 ”
将_CONSOLE
改为_WINDOWS
进入 “ 链接器 -> 子系统 ”,将控制台(/SUBSYSTEM:CONSOLE)
改为窗口(/SUBSYSTEM:WINDOWS)
然后点击右下角 “应用” 应用修改,至此,此问题得到了解决
③LNK2005:“RaiseException已经在exceptio.obj中定义” 报错
报错截图:
错误 LNK2005 RaiseException 已经在 exceptio.obj 中定义 LibGraphicsTest
报错原因:
libgraphics库中的
RaiseException
函数与kernel32.lib
中的RaiseException
冲突了,因此报错
解决方案:
可以对整个项目中的RaiseException
进行替换,我是将所有的RaiseException
替换为RaiseException_
CTRL+H快捷键打开替换,将所有的RaiseException
替换为RaiseException_
(也可以换成其他的名字)
接下来程序一般来说是可以运行了,但是尚且不能正常运行!因为运行时又出现了异常情况。
④已引发异常:Run-Time Check Failure #2 - Stack around the variable ‘title’ was corrupted.报错
报错截图:
Run-Time Check Failure #2 - Stack around the variable ‘title’ was corrupted.
报错原因:
经过一番痛苦的调试,我发现是
MaxTitle
开小了,只有75
,把MaxTitle
宏定义的数值调大就可以了.
解决方案:
打开graphics.c
文件,到第52行处将MaxTitle
宏定义的数值调整为1000
即可
解决完这个问题之后,程序就可以运行了,窗口中也会出现图形。
但是你可能会发现,这时候原本该显示的文字显示是乱码,窗口的标题也是乱码显示。
那么这该怎么办呢?
⑤最后的问题:文字显示乱码
错误截图:
错误原因:
项目的字符集设定不对
解决方案:
进入 “ 高级 -> 字符集 ”,将使用Unicode字符集
改为使用多字节字符集
大功告成了!!!!!
终于修好了
希望各位码的愉快!!!如果遇到什么问题可以评论
!!!!!!