2010-05-12 36 views
1

我在vs2010中创建了win32控制台应用程序(没有选择预编译头选项)。我插入了下面的代码。但* .obj链接失败。你能否向我提供有关错误的更多信息。我搜索了MSDN,但仍然无法理解它。用于ZLib示例代码编译的错误LNK2019

#include <stdio.h> 
#include "zlib.h" 

// Demonstration of zlib utility functions 

unsigned long file_size(char *filename) 
{ 
    FILE *pFile = fopen(filename, "rb"); 
    fseek (pFile, 0, SEEK_END); 
    unsigned long size = ftell(pFile); 
    fclose (pFile); 
    return size; 
} 

int decompress_one_file(char *infilename, char *outfilename) 
{ 
    gzFile infile = gzopen(infilename, "rb"); 
    FILE *outfile = fopen(outfilename, "wb"); 
    if (!infile || !outfile) return -1; 

    char buffer[128]; 
    int num_read = 0; 
    while ((num_read = gzread(infile, buffer, sizeof(buffer))) > 0) { 
     fwrite(buffer, 1, num_read, outfile); 
     } 

    gzclose(infile); 
    fclose(outfile); 
} 

int compress_one_file(char *infilename, char *outfilename) 
{ 
    FILE *infile = fopen(infilename, "rb"); 
    gzFile outfile = gzopen(outfilename, "wb"); 
    if (!infile || !outfile) return -1; 

    char inbuffer[128]; 
    int num_read = 0; 
    unsigned long total_read = 0, total_wrote = 0; 
    while ((num_read = fread(inbuffer, 1, sizeof(inbuffer), infile)) > 0) { 
     total_read += num_read; 
     gzwrite(outfile, inbuffer, num_read); 
    } 
    fclose(infile); 
    gzclose(outfile); 

    printf("Read %ld bytes, Wrote %ld bytes, Compression factor %4.2f%%\n", 
     total_read, file_size(outfilename), 
     (1.0-file_size(outfilename)*1.0/total_read)*100.0); 
}   
int main(int argc, char **argv) 
{ 
    compress_one_file(argv[1],argv[2]); 
    decompress_one_file(argv[2],argv[3]);} 

输出:

1>------ Build started: Project: zlibApp, Configuration: Debug Win32 ------ 
1> zlibApp.cpp 
1>d:\learning\cpp\cppvs2010\zlibapp\zlibapp\zlibapp.cpp(15): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 
1>   c:\program files\microsoft visual studio 10.0\vc\include\stdio.h(234) : see declaration of 'fopen' 
1>d:\learning\cpp\cppvs2010\zlibapp\zlibapp\zlibapp.cpp(25): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 
1>   c:\program files\microsoft visual studio 10.0\vc\include\stdio.h(234) : see declaration of 'fopen' 
1>d:\learning\cpp\cppvs2010\zlibapp\zlibapp\zlibapp.cpp(40): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 
1>   c:\program files\microsoft visual studio 10.0\vc\include\stdio.h(234) : see declaration of 'fopen' 
1>d:\learning\cpp\cppvs2010\zlibapp\zlibapp\zlibapp.cpp(36): warning C4715: 'decompress_one_file' : not all control paths return a value 
1>d:\learning\cpp\cppvs2010\zlibapp\zlibapp\zlibapp.cpp(57): warning C4715: 'compress_one_file' : not all control paths return a value 
1>zlibApp.obj : error LNK2019: unresolved external symbol _gzclose referenced in function "int __cdecl decompress_one_file(char *,char *)" ([email protected]@[email protected]) 
1>zlibApp.obj : error LNK2019: unresolved external symbol _gzread referenced in function "int __cdecl decompress_one_file(char *,char *)" ([email protected]@[email protected]) 
1>zlibApp.obj : error LNK2019: unresolved external symbol _gzopen referenced in function "int __cdecl decompress_one_file(char *,char *)" ([email protected]@[email protected]) 
1>zlibApp.obj : error LNK2019: unresolved external symbol _gzwrite referenced in function "int __cdecl compress_one_file(char *,char *)" ([email protected]@[email protected]) 
1>D:\learning\cpp\cppVS2010\zlibApp\Debug\zlibApp.exe : fatal error LNK1120: 4 unresolved externals 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

回答

2

啊,请原谅我问一下,但你实际上是zlib的(可能zlib1.dll如果您使用了最新版本的库或对象文件中的链接)?

该错误通常是由于您错过了其中包含代码的实际库而导致的。事实上,包含头文件可以让编译器知道这些函数存在,但除非将库与主代码链接在一起,否则链接程序将无法找到它们。

您的其他问题很小。忽略那些暗示你使用所谓的“安全”功能的人。这只是微软试图锁定供应商,并对希望编码到标准的程序员造成伤害。您可以通过添加

#define _CRT_SECURE_NO_DEPRECATE 

到您的源文件顶部来关闭这些警告。

“并非所有控制路径”警告都是因为您指定了两个函数来返回int,但实际上并没有返回。现在只需更改那些返回void,您可以稍后添加错误检查。

+0

我没有实际链接'zlib1.dll'。我搜索了代码并从** zlib.net **下载了zlib(1.2.5)。那我该如何解决这个问题。谢谢。 – 2010-05-12 07:49:39

+0

如果您已经从该网站获得了_source code_,则需要将各个源文件添加到您的项目中,或者您可以下载这个可能更简单的DLL(http://www.winimage.com/zLibDll/)的index.html)。 – paxdiablo 2010-05-12 07:49:42

+0

按照你的建议,我添加了'zcofig.h'和'zlib.h'到我的项目中,但仍然显示**错误LNK2019 **错误。 – 2010-05-12 07:56:00