VS2012的外部库zint的引入

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 02:14   54   0

因为打算做个用到条形码的小项目,所以下载了开源zint库,打算搞点事情。

环境:VS2012 ;win7 32位旗舰版

因为zint库依赖于libpng库以及zlib库,所以我先进行了这两个库的配置安装。

版本: zlib: 1.2.8 点击打开链接

libpng: libpng1629 点击打开链接 可以自己选择版本,在libpng16\projects\vstudio中有一个zlib.props,可以用记事本打开,查看对应的zlib版本,然后在上文的链接选择对应的zlib下载。

下载好后,将两个压缩包解压到同一个文件夹中,当然,最好这个文件夹建在你设置的VS的projects目录里。这样你在之后的库文件引入的时候可以省事许多。

打开你的libpng的文件夹,如下图红框中,用VS2012运行vstudio.sln。

进去后有一堆的项目文件,不用管,直接编译生成,成功后可以运行一个小的测试程序。

// zintlib_test1.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string>

#include "png.h"
#include "zlib.h"
#pragma warning(disable:4996)
/* Makes pngtest verbose so we can find problems. */
#ifndef PNG_DEBUG
# define PNG_DEBUG 2
#endif
#if PNG_DEBUG > 1
# define pngtest_debug(m) ((void)fprintf(stderr, m "\n"))
# define pngtest_debug1(m,p1) ((void)fprintf(stderr, m "\n", p1))
# define pngtest_debug2(m,p1,p2) ((void)fprintf(stderr, m "\n", p1, p2))
#else
# define pngtest_debug(m) ((void)0)
# define pngtest_debug1(m,p1) ((void)0)
# define pngtest_debug2(m,p1,p2) ((void)0)
#endif
unsigned char* buffer = NULL;
png_uint_32 width, height;
int color_type;

//获取每一行所用的字节数,需要凑足4的倍数
int getRowBytes(int width){
//刚好是4的倍数
if ((width * 3) % 4 == 0){
return width * 3;
}
else{
return ((width * 3) / 4 + 1) * 4;
}
}

int main(int c, char** v) {

png_structp png_ptr;
png_infop info_ptr;
int bit_depth;
FILE *fp;

printf("lpng[%s], zlib[%s]\n", PNG_LIBPNG_VER_STRING, ZLIB_VERSION);

if ((fopen_s(&fp,"1.png","rb")) ){
return EXIT_FAILURE;
}
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (png_ptr == NULL)
{
fclose(fp);
return EXIT_FAILURE;
}
info_ptr = png_create_info_struct(png_ptr);
if (info_ptr == NULL)
{
fclose(fp);
png_destroy_read_struct(&png_ptr, NULL, NULL);
return EXIT_FAILURE;
}
if (setjmp(png_jmpbuf(png_ptr))) {
/* Free all of the memory associated with the png_ptr and info_ptr */
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
fclose(fp);
/* If we get here, we had a problem reading the file */
return EXIT_FAILURE;
}
/* Set up the input control if you are using standard C streams */
png_init_io(png_ptr, fp);
//读取png文件
png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_EXPAND, 0);
//获取png图片相关信息
png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, NULL, NULL, NULL);
printf("width[%d], height[%d], bit_depth[%d], color_type[%d]\n",
width, height, bit_depth, color_type);

//获得所有png数据
png_bytep* row_pointers = png_get_rows(png_ptr, info_ptr);
//计算buffer大小
unsigned int bufSize = 0;
if (color_type == PNG_COLOR_TYPE_RGB) {
bufSize = getRowBytes(width) * height;
}
else if (color_type == PNG_COLOR_TYPE_RGBA) {
bufSize = width * height * 4;
}
else{
return EXIT_FAILURE;
}
//申请堆空间
buffer = (unsigned char*)malloc(bufSize);
unsigned int i;
for (i = 0; i < height; i++) {
//拷贝每行的数据到buffer,
//opengl原点在下方,拷贝时要倒置一下
if (color_type == PNG_COLOR_TYPE_RGB){
memcpy(buffer + getRowBytes(width) * i, row_pointers[height - i - 1], width * 3);
}
else if (color_type == PNG_COLOR_TYPE_RGBA){
memcpy(buffer + i * width * 4, row_pointers[height - i - 1], width * 4);
}
}
png_destroy_read_struct(&png_ptr, &info_ptr, 0);
fclose(fp);
return 0;
}

测试程序是我借用一位大神的,我就是看着他的教程完成了这个库的配置,但是测试程序有点小问题,最经典的fopen函数在VS中会显示不安全,给予错误4996而无法用,我试着用#pragma warning(disable:4996)屏蔽这个,但是无效。也尝试了在alt+F7的配置界面的C/C++目录下的预处理器定义中加上_CRT_SECURE_NO_WARNINGS关键字,但是也无效,无奈之下我使用了fopen_s函数,与fopen函数有小差别,多了一个参数,有一个二级指针,所以我对我的文件指针取了地址传给了fopen_s函数,函数中可以看到。

然后就是对于之前编译好的库的引入,

A、添加工程的头文件目录:工程---属性---配置属性---c/c++---常规---附加包含目录:加上可函数对应的头文件存放目录,也就是你那两个压缩包的解压目录,如下图

B、添加文件引用的lib静态库路径:工程---属性---配置属性---链接器---常规---附加库目录:加上lib文件存放目录。


C 然后添加工程引用的lib文件名:工程---属性---配置属性---链接器---输入---附加依赖项:加上lib文件名。

完成了这些,基本就搞定了开始的zlib以及libpng库,可以运行程序。不过会很慢,耐心等待。结果如下,会显示你的库的版本。

期间我遇到一个问题:错误:调试器:: 在进程加载过程中引发了未处理的无法继续的 STATUS_DLL_NOT_FOUND 异常 程序“[3048] text2.exe: 本机”已退出,返回值为 -1073741515 (0xc0000135)。 解决方法:找到程序中用到的动态库,把dll文件放在exe文件同一个目录就可以了。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP