1

vs2010でwin32コンソールアプリケーションを作成しました(プリコンパイル済みヘッダーのオプションを選択せず​​に)。そして、以下のコードを挿入しました。しかし、*。objリンクは失敗しました。エラーについて詳しく教えてください。MSDNを検索しましたが、それでも理解できません。

#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 *)" (?decompress_one_file@@YAHPAD0@Z)
1>zlibApp.obj : error LNK2019: unresolved external symbol _gzread referenced in function "int __cdecl decompress_one_file(char *,char *)" (?decompress_one_file@@YAHPAD0@Z)
1>zlibApp.obj : error LNK2019: unresolved external symbol _gzopen referenced in function "int __cdecl decompress_one_file(char *,char *)" (?decompress_one_file@@YAHPAD0@Z)
1>zlibApp.obj : error LNK2019: unresolved external symbol _gzwrite referenced in function "int __cdecl compress_one_file(char *,char *)" (?compress_one_file@@YAHPAD0@Z)
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 ==========
4

1 に答える 1

2

ああ、質問して申し訳ありませんが、実際に zlib のライブラリまたはオブジェクト ファイルにリンクしていますか (おそらくzlib1.dll最新バージョンを使用している場合)。

このエラーは通常、コードを含む実際のライブラリが見つからないことが原因で発生します。ヘッダー ファイルをインクルードすることで、コンパイラはそれらの関数が存在することを認識できますが、ライブラリをメイン コードと一緒にリンクしない限り、リンカーはそれらを見つけることができません。

あなたの他の問題は軽微です。いわゆる「安全な」関数を使用することを示唆するものは無視してください。これは、Microsoft が何らかのベンダーロックインを試みているだけであり、標準に従ってコーディングしたいプログラマーに不利益をもたらしています。追加することで、これらの警告を黙らせることができます

#define _CRT_SECURE_NO_DEPRECATE

ソースファイルの先頭に。

「すべての制御パスではない」という警告は、2 つの関数が を返すように指定しているintが、実際には 1 つを返さないためです。今のところa を返すように変更するだけvoidで、後でエラー チェックを追加できます。

于 2010-05-12T07:31:14.557 に答える