【问题标题】:How to keep g++ from taking header file from /usr/include?如何防止 g++ 从 /usr/include 获取头文件?
【发布时间】:2010-04-27 03:29:28
【问题描述】:

我正在使用 zlib.h 构建,我有一个 v1.2.5 的本地副本,但在 /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 被包含两次,带有两组不同的 -D 值,但我没有不知道这是怎么回事:

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 行会一起出现,但因此会出现有关重复声明的警告。

【问题讨论】:

    标签: g++ c-preprocessor header-files zlib


    【解决方案1】:

    -nostdinc回答了你Q标题中的问题——引用this manpage,意思是:

    不要搜索标准系统 头文件的目录。只有 您使用 -I 指定的目录 选项(和目录 当前文件,如果合适的话)是 搜索。

    但是,我认为它不会解决您的实际问题,这似乎是由于包含了同一个非系统头文件的两个相互不兼容的部分——感觉更有可能是由于需要一些 @ 987654323@ 不见了,但我不能确切地说出是什么,因为我不熟悉那个特定的头文件。

    【讨论】:

      【解决方案2】:

      我的猜测是,在某些情况下你有:

      #include <zlib.h>

      在别人身上你有

      #include "zlib.h"

      您将在第一种情况下找到旧的(系统)zlib.h,在第二种情况下找到新的(用户)zlib.h。

      解决此问题的方法是使用 -isystem 而不是 -I 用于您的新 zlib 包含,即 -isystem /my/path/to/zlib/includes 而不是 -I /my/path/to/zlib/includes

      【讨论】:

        【解决方案3】:

        我在 Solaris 5.10(64 位 SPARC)上编译 leptonica 时遇到了类似的错误,我同意 Alex 的观点:缺少一些必要的定义或其他什么。一时兴起,我添加了 _FILE_OFFSET_BITS=64 (./configure CPPFLAGS='-D_FILE_OFFSET_BITS=64'),它“有效”(它已编译)。当然,这有点像货物崇拜编程,因为我不知道为什么我必须这样做。我实际上还没有尝试使用 leptonica,所以它可能是核心或其他东西,因为我在构建它时添加了定义。

        【讨论】:

          猜你喜欢
          • 2015-01-17
          • 1970-01-01
          • 1970-01-01
          • 2016-07-31
          • 2021-10-01
          • 2012-06-08
          • 2010-10-05
          • 2014-11-24
          • 2013-12-05
          相关资源
          最近更新 更多