如何保持 g++从 /usr/include 获取头文件?

发布于 2024-08-30 13:14:11 字数 5567 浏览 8 评论 0原文

我正在使用 zlib.h 进行构建,我有 v1.2.5 的本地副本,但在 /usr/include/zlib.h 中有 v1.2.1.2。

如果我省略添加 -I/my/path/to/zlib 到我的 make 中,我会因使用没有 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

I不知道如何进一步追踪这一点。我尝试将 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;};

不确定为什么第 1566 行和第 1582 行在 CPP 输出中一起出现,但因此出现了有关重复声明的警告。

I am building using zlib.h which I have a local copy to v1.2.5, but in /usr/include/zlib.h there is v1.2.1.2.

If I omit adding -I/my/path/to/zlib to my make I get error from using old version which doesn't have 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

Alternatively, if I add the include path to the zlib z1.2.5 I am using, I get double defines, it seems as if the zlib.h is included twice with two different sets of -D values, but I don't see how that is happening:

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)'

Here some of the relavent lines from zlib.h referred to above:

// 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

I'm not sure how to track this down further. I tried moving the include of zlib.h to the top and bottom of the includes list of the cpp file, but it made no difference.

An excerpt of passing -E to g++ shows in part:

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;};

Not sure why lines 1566 and 1582 are coming out together in the CPP output, but hence the warning about duplicate declarations.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

戒ㄋ 2024-09-06 13:14:11

-nostdinc 回答了 Q 标题中的问题 - 引用此手册页< /a>,它的意思是:

不搜索标准系统
头文件的目录。只有
使用 -I 指定的目录
选项(以及目录
当前文件(如果适用)是
已搜索。

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

-nostdinc answers the question in your Q's title -- quoting this manpage, it means:

Do not search the standard system
directories for header files. Only the
directories you have specified with -I
options (and the directory of the
current file, if appropriate) are
searched.

However, I don't think it will solve your actual problem, which seems to be due to two mutually incompatible parts of the same non-system header file getting included -- that feels more likely to be due to some needed -D being missing, but I can't say exactly what since I'm not familiar with that specific header file.

一瞬间的火花 2024-09-06 13:14:11

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

#include

而在其他情况下您有

#include "zlib.h"

您会发现旧的 (第一种情况是系统)zlib.h,第二种情况是新的(用户)zlib.h。

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

My guess is that in some instances you have:

#include <zlib.h>

and in others you have

#include "zlib.h"

You will find the old (system) zlib.h in the first case and the new (user) zlib.h in the second case.

The fix for this is to use -isystem instead of -I for your new zlib includes, i.e. -isystem /my/path/to/zlib/includes instead of -I /my/path/to/zlib/includes.

尤怨 2024-09-06 13:14:11

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

I got a similar error when compiling leptonica on Solaris 5.10 (64-bit SPARC), and I agree with Alex: some necessary define is missing or something. On a whim, I added _FILE_OFFSET_BITS=64 (./configure CPPFLAGS='-D_FILE_OFFSET_BITS=64'), which "worked" (it compiled). This is a bit of cargo-cult programming of course, 'cause I don't know why I should have had to do that. I haven't actually tried to use leptonica yet, so it might core or something 'cause I added that define when I built it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文