1

v1.2.5 のローカル コピーがある zlib.h を使用してビルドしていますが、/usr/include/zlib.h には v1.2.1.2 があります。

make に -I/my/path/to/zlib を追加しないと、Z_FIXED を持たない古いバージョンを使用するとエラーが発生します。

g++ -g -Werror -Wredundant-decls -D_FILE_OFFSET_BITS=64 -c -o ARCH.linux_26_i86/debug/sysParam.o sysParam.cpp
sysParam.cpp: In member function `std::string CSysParamAccess::getCompressionStrategyName() const':
sysParam.cpp:1816: error: `Z_FIXED' was not declared in this scope
sysParam.cpp: In member function `bool CSysParamAccess::setCompressionStrategy(const std::string&, paramSource)':
sysParam.cpp:1849: error: `Z_FIXED' was not declared in this scope

または、使用している zlib z1.2.5 にインクルード パスを追加すると、二重定義が取得されます。zlib.h が 2 つの異なる -D 値のセットで 2 回含まれているように見えますが、方法がわかりません。それが起こっています:

g++ -g -Werror -Wredundant-decls -I../../src/zlib-1.2.5 -D_FILE_OFFSET_BITS=64 -c -o ARCH.linux_26_i86/debug/sysParam.o sysParam.cpp
In file included from sysParam.cpp:24:
../../src/zlib-1.2.5/zlib.h:1582: warning: redundant redeclaration of `void* gzopen64(const char*, const char*)' in same scope
../../src/zlib-1.2.5/zlib.h:1566: warning: previous declaration of `void* gzopen64(const char*, const char*)'
../../src/zlib-1.2.5/zlib.h:1583: warning: redundant redeclaration of `long long int gzseek64(void*, long long int, int)' in same scope
../../src/zlib-1.2.5/zlib.h:1567: warning: previous declaration of `off64_t gzseek64(void*, off64_t, int)'
../../src/zlib-1.2.5/zlib.h:1584: warning: redundant redeclaration of `long long int gztell64(void*)' in same scope
../../src/zlib-1.2.5/zlib.h:1568: warning: previous declaration of `off64_t gztell64(void*)'
../../src/zlib-1.2.5/zlib.h:1585: warning: redundant redeclaration of `long long int gzoffset64(void*)' in same scope
../../src/zlib-1.2.5/zlib.h:1569: warning: previous declaration of `off64_t gzoffset64(void*)'
../../src/zlib-1.2.5/zlib.h:1586: warning: redundant redeclaration of `uLong adler32_combine64(uLong, uLong, long long int)' in same scope
../../src/zlib-1.2.5/zlib.h:1570: warning: previous declaration of `uLong adler32_combine64(uLong, uLong, off64_t)'
../../src/zlib-1.2.5/zlib.h:1587: warning: redundant redeclaration of `uLong crc32_combine64(uLong, uLong, long long int)' in same scope
../../src/zlib-1.2.5/zlib.h:1571: warning: previous declaration of `uLong crc32_combine64(uLong, uLong, off64_t)'

上記で参照した zlib.h の関連行の一部を次に示します。

// This would be line 1558 of zlib.h
/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or
 * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if
 * both are true, the application gets the *64 functions, and the regular
 * functions are changed to 64 bits) -- in case these are set on systems
 * without large file support, _LFS64_LARGEFILE must also be true
 */
#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0
   ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));
   ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int));
   ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile));
   ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));
   ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t));
   ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t));
#endif

#if !defined(ZLIB_INTERNAL) && _FILE_OFFSET_BITS-0 == 64 && _LFS64_LARGEFILE-0
#  define gzopen gzopen64
#  define gzseek gzseek64
#  define gztell gztell64
#  define gzoffset gzoffset64
#  define adler32_combine adler32_combine64
#  define crc32_combine crc32_combine64
#  ifdef _LARGEFILE64_SOURCE
     ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));
     ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int));
     ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile));
     ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile));
     ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t));
     ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t));
#  endif
#else
   ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *));
   ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int));
   ZEXTERN z_off_t ZEXPORT gztell OF((gzFile));
   ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile));
   ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t));
   ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t));
#endif
// This would be line 1597 of zlib.h

これをさらに追跡する方法がわかりません。zlib.h のインクルードを cpp ファイルのインクルード リストの上下に移動してみましたが、違いはありませんでした。

-E を g++ に渡す部分の抜粋:

extern int inflateInit2_ (z_streamp strm, int windowBits, const char *version, int stream_size);

extern int inflateBackInit_ (z_streamp strm, int windowBits, unsigned char *window, const char *version, int stream_size);
# 1566 "../../src/zlib-1.2.5/zlib.h"
   extern gzFile gzopen64 (const char *, const char *);
   extern off64_t gzseek64 (gzFile, off64_t, int);
   extern off64_t gztell64 (gzFile);
   extern off64_t gzoffset64 (gzFile);
   extern uLong adler32_combine64 (uLong, uLong, off64_t);
   extern uLong crc32_combine64 (uLong, uLong, off64_t);
# 1582 "../../src/zlib-1.2.5/zlib.h"
     extern gzFile gzopen64 (const char *, const char *);
     extern long long gzseek64 (gzFile, long long, int);
     extern long long gztell64 (gzFile);
     extern long long gzoffset64 (gzFile);
     extern uLong adler32_combine64 (uLong, uLong, long long);
     extern uLong crc32_combine64 (uLong, uLong, long long);
# 1600 "../../src/zlib-1.2.5/zlib.h"
    struct internal_state {int dummy;};

CPP 出力で 1566 行と 1582 行が一緒に出力される理由は不明ですが、宣言の重複に関する警告が表示されます。

4

3 に答える 3

3

-nostdincQのタイトルの質問に答えます-このマンページを引用すると、それは次のことを意味します:

標準のシステムディレクトリでヘッダーファイルを検索しないでください。-Iオプションで指定したディレクトリ(および適切な場合は現在のファイルのディレクトリ)のみが検索されます。

ただし、実際の問題は解決しないと思います。これは、同じ非システムヘッダーファイルの相互に互換性のない2つの部分がインクルードされているためと思われます。これは、必要な-Dものが欠落していることが原因である可能性が高いと思われますが、私はその特定のヘッダーファイルに精通していないので、正確に何を言うことはできません。

于 2010-04-27T04:18:29.237 に答える
0

Solaris 5.10(64ビットSPARC)でleptonicaをコンパイルするときに同様のエラーが発生し、Alexに同意します。必要な定義が欠落しているか何かがあります。気まぐれに、私は_FILE_OFFSET_BITS = 64(./configure CPPFLAGS ='-D_FILE_OFFSET_BITS = 64')を追加しました。これは「機能」しました(コンパイルされました)。もちろん、これはちょっとしたカーゴカルトプログラミングです。なぜなら、なぜそうしなければならなかったのかわからないからです。私はまだ実際にレプトニカを使おうとはしていません。それで、それを構築したときに定義を追加したので、それはコアか何かかもしれません。

于 2010-05-25T20:25:30.713 に答える
0

私の推測では、場合によっては次のようになります。

#include <zlib.h>

そして他の人にはあなたが持っている

#include "zlib.h"

最初のケースでは古い (システム) zlib.h が見つかり、2 番目のケースでは新しい (ユーザー) zlib.h が見つかります。

これを修正するには、新しい zlib インクルードの-isystem代わりに、つまり.-I-isystem /my/path/to/zlib/includes-I /my/path/to/zlib/includes

于 2010-04-27T04:47:02.953 に答える