c++下zlib的编译问题

officederek 2012-06-09 12:46:15

#include <cstring>
#include <cstdlib>
#include <iostream>
#include "zlib.h"
using namespace std;
int main()
{
int err;
Byte compr[200], uncompr[200]; // big enough
uLong comprLen, uncomprLen;
const char* hello = "12345678901234567890123456789012345678901234567890";
uLong len = strlen(hello) + 1;
comprLen = sizeof(compr) / sizeof(compr[0]);
err = compress(compr, &comprLen, (const Bytef*)hello, len);
if (err != Z_OK)
{
cerr << "compess error: " << err << '/n';
exit(1);
}
cout << "orignal size: " << len
<< " , compressed size : " << comprLen << '/n';
strcpy((char*)uncompr, "garbage");
err = uncompress(uncompr, &uncomprLen, compr, comprLen);
if (err != Z_OK) {
cerr << "uncompess error: " << err << '/n';
exit(1);
}
cout << "orignal size: " << len
<< " , uncompressed size : " << uncomprLen << '/n';
if (strcmp((char*)uncompr, hello)) {
cerr << "BAD uncompress!!!/n";
exit(1);
}
else
{
cout << "uncompress() succeed: /n" << (char *)uncompr;
}
return 0;
}

想用zlib制作压缩工具,这个代码是网上找的。
此CPP文件与zlib.h以及zconf.h在同一目录下,win32 console application工程,编译通过,运行出错:

--------------------Configuration: big - Win32 Debug--------------------
Linking...
big.obj : error LNK2001: unresolved external symbol _uncompress
big.obj : error LNK2001: unresolved external symbol _compress
Debug/big.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.

big.exe - 3 error(s), 0 warning(s)

请问如何解决?
...全文
342 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
officederek 2012-06-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

1)请先确认您下的是完整zlib源程序还是zlib的库;
2)如果是完整的源程序,除example.cpp、minigzip等几个演示程序外将所有源码加到工程文件(具体哪些文件记不得了)
3)如果是zlib库,请确认相关的zlib.lib是否被加入到工程文件;运行时将相应zlib.dll放在合适位置(现在还没到运行的时候)
4)因为zlib是c文件,LZ的是CPP文件,请确认zlib.h中……
[/Quote]
将整个文件夹里的所有文件复制到工程文件夹下后连接成功了,运行结果也正确,谢谢!
qq120848369 2012-06-09
  • 打赏
  • 举报
回复
加一个编译选项:
-D__cplusplus

动态库使用zlib没问题,主要是你没加载好动态库。
officederek 2012-06-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

compress这些定义在哪?
如果头文件里面只有声明的话,找找有没有lib文件,用1L的方法链入lib库
[/Quote]
我搜索了其他所有文件都没发现定义……
officederek 2012-06-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

1)请先确认您下的是完整zlib源程序还是zlib的库;
2)如果是完整的源程序,除example.cpp、minigzip等几个演示程序外将所有源码加到工程文件(具体哪些文件记不得了)
3)如果是zlib库,请确认相关的zlib.lib是否被加入到工程文件;运行时将相应zlib.dll放在合适位置(现在还没到运行的时候)
4)因为zlib是c文件,LZ的是CPP文件,请确认zlib.h中……
[/Quote]
压缩包我已经放出来了,我也不知道是不是完整的库……在zlib.h中的确有那一句。
officederek 2012-06-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

是不是还需要链接什么库文件?
#pragma comment(lib, "....")
[/Quote]
没找到任何.lib或者.dll文件,压缩包在此http://cfanderek.cwsurf.de/temp//zlib-1.2.7.tar.gz
qq120848369 2012-06-09
  • 打赏
  • 举报
回复
没找到定义, 照楼上说的做.
「已注销」 2012-06-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

compress这些定义在哪?
如果头文件里面只有声明的话,找找有没有lib文件,用1L的方法链入lib库
[/Quote]
不需要这样复杂,zlib库设计的满成熟的,基本原始的库不需要作什么复杂改动,直接链接到程序中就可以了;
个人推荐使用完整的zlib源码,而非zlib的开发库(个人喜好):至少不需要到处拖着个zlib.dll
「已注销」 2012-06-09
  • 打赏
  • 举报
回复
1)请先确认您下的是完整zlib源程序还是zlib的库;
2)如果是完整的源程序,除example.cpp、minigzip等几个演示程序外将所有源码加到工程文件(具体哪些文件记不得了)
3)如果是zlib库,请确认相关的zlib.lib是否被加入到工程文件;运行时将相应zlib.dll放在合适位置(现在还没到运行的时候)
4)因为zlib是c文件,LZ的是CPP文件,请确认zlib.h中是否有这么一句:(CPP和C的命名方式不一样,所以编译后直接调用会找不到)
#ifdef __cplusplus
extern "C" {
#endif
5)最后实在搞不定,可以将zlib的所有.c文件改成.cpp(必须是完整源码,不推荐,至少是不规范做法)

我用的是zlib的1.2.2版本和zlib 1.0.4版本,没有问题
昵称很不好取 2012-06-09
  • 打赏
  • 举报
回复
compress这些定义在哪?
如果头文件里面只有声明的话,找找有没有lib文件,用1L的方法链入lib库
Eleven 2012-06-09
  • 打赏
  • 举报
回复
是不是还需要链接什么库文件?
#pragma comment(lib, "....")

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧