VC6.0添加附加依赖库zlibstat.lib报链接错误unresolved external symbol __time64

Mr_Effiya 2019-08-22 03:42:42
我下载的是最新版的zlib-1.2.11
使用VS2008命令行工具运行的bld_ml32.bat
使用VS2008生成的Release,WIN32版本的zlibstat.lib

我想在我的项目中使用minizip来压缩文件夹,以使压缩完的文件能用当下大部分的解压软件解压

zlib-1.2.11.tar.gz解压后的文件名为zlib

接下来就是在项目中使用minizip了
我在工具-》选项-》目录的include files中添加了zlib的路径,Librarys files中添加了zlib/contrib/VStudio/VC9/X86/ZLIBSTATRELEASE的路径

我在我的项目StdAfx.h中添加了如下代码
#define ZLIB_WINAPI
extern "C"
{
#include "contrib/minizip/zip.h"
}
#pragma comment(lib , "zlibstat")

然后在我项目的一个cpp中,添加了如下代码:
//将文件添加到zip文件中,注意如果源文件srcFile为空则添加空目录
//fileNameInZip: 在zip文件中的文件名,包含相对路径
void CNSHSendNDlg::AddFileToZip(zipFile zf, const char* fileNameInZip, const char* srcFile)
{
FILE* srcfp = NULL;

//初始化写入zip的文件信息
zip_fileinfo zi;
zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour =
zi.tmz_date.tm_mday = zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0;
zi.dosDate = 0;
zi.internal_fa = 0;
zi.external_fa = 0;

//如果srcFile为空,加入空目录
char new_file_name[MAX_PATH];
memset(new_file_name, 0, sizeof(new_file_name));
strcat(new_file_name, fileNameInZip);
if (srcFile == NULL)
{
strcat(new_file_name, "\\");
}

//在zip文件中创建新文件
zipOpenNewFileInZip(zf, new_file_name, &zi, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_DEFAULT_COMPRESSION);

if (srcFile != NULL)
{
//打开源文件
srcfp = fopen(srcFile, "rb");
if (srcfp == NULL)
{
MessageBox(_T("无法添加文件") + CString(srcFile) + _T("!"));
zipCloseFileInZip(zf); //关闭zip文件
return;
}

//读入源文件并写入zip文件
char buf[100*1024]; //buffer
int numBytes = 0;
while( !feof(srcfp) )
{
numBytes = fread(buf, 1, sizeof(buf), srcfp);
zipWriteInFileInZip(zf, buf, numBytes);
if( ferror(srcfp) )
break;
}

//关闭源文件
fclose(srcfp);
}

//关闭zip文件
zipCloseFileInZip(zf);
}

//递归添加子目录到zip文件
void CNSHSendNDlg::CollectFilesInDirToZip(zipFile zf, const CString& strPath, const CString& parentDir)
{
USES_CONVERSION; //for T2CA

CString strRelativePath;
CFileFind finder;
BOOL bWorking = finder.FindFile(strPath + _T("\\*.*"));
while(bWorking)
{
bWorking = finder.FindNextFile();
if(finder.IsDots())
continue;

if (parentDir == _T(""))
strRelativePath = finder.GetFileName();
else
strRelativePath = parentDir + _T("\\") + finder.GetFileName(); //生成在zip文件中的相对路径

if(finder.IsDirectory())
{
AddFileToZip(zf, T2CA(strRelativePath), NULL); //在zip文件中生成目录结构
CollectFilesInDirToZip(zf, finder.GetFilePath(), strRelativePath); //递归收集子目录文件
continue;
}

AddFileToZip(zf, T2CA(strRelativePath), T2CA(finder.GetFilePath())); //将文件添加到zip文件中
}
}

//最终接口:从某个目录创建zip文件
void CNSHSendNDlg::CreateZipFromDir(const CString& dirName, const CString& zipFileName)
{
USES_CONVERSION; //使用T2CA转换unicode字符集
zipFile newZipFile = zipOpen(T2CA(zipFileName), APPEND_STATUS_CREATE); //创建zip文件
if (newZipFile == NULL)
{
MessageBox(_T("无法创建zip文件!"));
return;
}

CollectFilesInDirToZip(newZipFile, dirName, _T(""));
zipClose(newZipFile, NULL); //关闭zip文件
}

然后编译就会报错:
zlibstat.lib(zip.obj) : error LNK2001: unresolved external symbol __time64

找了半天了,还是找不出问题在哪,
最后补充下:
我在VS2008中生成zlibstat.lib时,zlibstat项目属性设置为
静态库(lib)
使用标准Windows库
不适用ATL
字符集未设置

希望大佬能帮忙看下,我这边又来个新活,可能很晚会回复
...全文
2978 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
善见致知 2019-11-18
  • 打赏
  • 举报
回复
我编了zlibstat.lib静态库,想直接用minizip里面的接口,编了个exe,运行时报 需要zlib.dll。可是我不是已经编了静态库了吗?为什么还需要dll???
小瑞o 2019-08-25
  • 打赏
  • 举报
回复
感受到了强烈的学术氛围,刚来到这里的小白有种相见恨晚的赶脚
Mr_Effiya 2019-08-25
  • 打赏
  • 举报
回复
引用 12 楼 super_admi 的回复:
恭喜你成功地坑了自己。 [quote=引用 11 楼 Mr_Effiya 的回复:] [quote=引用 10 楼 super_admi 的回复:] 我记得vc6是不支持64位编译的吧?换个32位版本的lib试试。
对,用的32位的lib,我编译的静态库zlibstat.lib不行,用不了,然后转成动态库了,就好使了[/quote][/quote] 咳,吃一堑长一智
super_admi 2019-08-24
  • 打赏
  • 举报
回复
恭喜你成功地坑了自己。

引用 11 楼 Mr_Effiya 的回复:
[quote=引用 10 楼 super_admi 的回复:]
我记得vc6是不支持64位编译的吧?换个32位版本的lib试试。

对,用的32位的lib,我编译的静态库zlibstat.lib不行,用不了,然后转成动态库了,就好使了[/quote]
super_admi 2019-08-24
  • 打赏
  • 举报
回复
我记得vc6是不支持64位编译的吧?换个32位版本的lib试试。
Mr_Effiya 2019-08-24
  • 打赏
  • 举报
回复
引用 10 楼 super_admi 的回复:
我记得vc6是不支持64位编译的吧?换个32位版本的lib试试。
对,用的32位的lib,我编译的静态库zlibstat.lib不行,用不了,然后转成动态库了,就好使了
Mr_Effiya 2019-08-23
  • 打赏
  • 举报
回复
引用 8 楼 Mr_Effiya 的回复:
[quote=引用 7 楼 zgl7903 的回复:] 不能用VS2008, 就想办法用 VC6编译生成库, 再编译链接 或者用vS2008写一个封装DLL, 供VC6调用
感谢你对我工作的帮助,我自己找到了解决方法,也很大程度上来自你的帮助。 解决方法如下: 安装VS2010 使用VS2010的命令行提示工具,执行bld_ml32.bat 打开vc10目录下的.sln 配置管理器选择Release,WIN32 把所有项目都重新生成一下 把zlib.h,zconf.h,/contrib/minizip/zip.h,/contrib/minizip/ioapi.h,ZlibDllRelease/zlibwapi.lib拷贝到项目所在文件夹下 项目StdAfx.h文件中加入如下代码 #define ZLIB_WINAPI extern "C" { #include "zip.h" }; #pragma comment(lib , "zlibwapi") 编译完美通过,忘出现上述情况(使用VC6.0)的小伙伴看到该贴能避开这个坑[/quote] 更正一下,上述有问题,使用VS2010编译不出zlibwapi.dll, 编译报错:fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 网上找了解决方法,不行,建议不要在这里做多余工作 解决方法: 别用VS2010了,我用VS2008,重新生成zlibvc项目,就会在x86目录下生成 zlibwapi.lib和zliwapi.dll,加入到项目文件夹下,解决
Mr_Effiya 2019-08-23
  • 打赏
  • 举报
回复
引用 7 楼 zgl7903 的回复:
不能用VS2008, 就想办法用 VC6编译生成库, 再编译链接 或者用vS2008写一个封装DLL, 供VC6调用
感谢你对我工作的帮助,我自己找到了解决方法,也很大程度上来自你的帮助。 解决方法如下: 安装VS2010 使用VS2010的命令行提示工具,执行bld_ml32.bat 打开vc10目录下的.sln 配置管理器选择Release,WIN32 把所有项目都重新生成一下 把zlib.h,zconf.h,/contrib/minizip/zip.h,/contrib/minizip/ioapi.h,ZlibDllRelease/zlibwapi.lib拷贝到项目所在文件夹下 项目StdAfx.h文件中加入如下代码 #define ZLIB_WINAPI extern "C" { #include "zip.h" }; #pragma comment(lib , "zlibwapi") 编译完美通过,忘出现上述情况(使用VC6.0)的小伙伴看到该贴能避开这个坑
zgl7903 2019-08-23
  • 打赏
  • 举报
回复
不能用VS2008, 就想办法用 VC6编译生成库, 再编译链接 或者用vS2008写一个封装DLL, 供VC6调用
Mr_Effiya 2019-08-22
  • 打赏
  • 举报
回复
引用 4 楼 cky77 的回复:
为啥用那么老的编译器
公司老项目,移植代价太大
Mr_Effiya 2019-08-22
  • 打赏
  • 举报
回复
引用 2 楼 schlafenhamster 的回复:
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/time-time32-time64?view=vs-2019
感谢你的回答,我之前也关注到了这里,但是没有想到宏定义的解决方法, 但是增加了宏定义后,还是出现了找不到__time32的问题
cky77 2019-08-22
  • 打赏
  • 举报
回复
为啥用那么老的编译器
Mr_Effiya 2019-08-22
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903 的回复:
VC6 不支持64位时间 VS2008 编译时 定义 _USE_32BIT_TIME_T 或者项目也转为VS2008来编译链接
感谢你的回答 在VS2008中项目-》属性-》C++-》预处理器-》预处理的定义中加入了 _USE_32BIT_TIME_T 回到VC6.0中,使用新生成的lib重新组建项目,发现如下链接错误: zlibstat.lib(zip.obj) : error LNK2001: unresolved external symbol __time32 可能不是这个的问题
zgl7903 2019-08-22
  • 打赏
  • 举报
回复
VC6 不支持64位时间 VS2008 编译时 定义 _USE_32BIT_TIME_T 或者项目也转为VS2008来编译链接
VC 6.0常见安装错误 VC调试常见错误 程序设计到多线程,VC++6.0默认设置可作以下修改: project->settings->C/C++->Category中选Code Generation->Use Run-time Library选Debug MultiThreaded或MultiThreaded 在创建MFC项目时, 不使用MFC AppWizard向导, 如果没有设置好项目参数, 就会在编译时产生很多连接错误, 如error LNK2001错误, 典型的错误提示有: libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16 msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16 nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex 下面介绍解决的方法: 1. Windows子系统设置错误, 提示: libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main Windows项目要使用Windows子系统, 而不是Console, 可以这样设置: [Project] --> [Settings] --> 选择"Link"属性页, 在Project Options中将/subsystem:console改成/subsystem:windows 2. Console子系统设置错误, 提示: LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16 控制台项目要使用Console子系统, 而不是Windows, 设置: [Project] --> [Settings] --> 选择"Link"属性页, 在Project Options中将/subsystem:windows改成/subsystem:console 3. 程序入口设置错误, 提示: msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16 通常, MFC项目的程序入口函数是WinMain, 如果编译项目的Unicode版本, 程序入口必须改为wWinMainCRTStartup, 所以需要重新设置程序入口: [Project] --> [Settings] --> 选择"C/C++"属性页, 在Category中选择Output, 再在Entry-point symbol中填入wWinMainCRTStartup, 即可 4. 线程运行时设置错误, 提示:

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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