Как не дать g ++ получить заголовочный файл из / usr / include? - PullRequest
0 голосов
/ 27 апреля 2010

Я строю с использованием 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

В качестве альтернативы, если я добавлю include-путь к 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;};

Не уверен, почему строки 1566 и 1582 выходят вместе в выводе CPP, но, следовательно, предупреждение о дублирующих декларациях.

Ответы [ 3 ]

2 голосов
/ 27 апреля 2010

-nostdinc отвечает на вопрос в заголовке вашего Q - цитируя эту справочную страницу , это означает:

Не искать в стандартной системе каталоги для заголовочных файлов. Только каталоги, которые вы указали с помощью -I варианты (и каталог текущий файл, если необходимо) поиск.

Однако я не думаю, что это решит вашу реальную проблему, которая, по-видимому, связана с включением двух взаимно несовместимых частей одного и того же несистемного заголовочного файла - что, скорее всего, связано с необходимостью 1010 * отсутствует, но я не могу точно сказать, что, поскольку я не знаком с этим конкретным заголовочным файлом.

0 голосов
/ 26 мая 2010

Я получил похожую ошибку при компиляции leptonica в Solaris 5.10 (64-битный SPARC), и я согласен с Алексом: отсутствует какое-то необходимое определение или что-то в этом роде. По прихоти я добавил _FILE_OFFSET_BITS = 64 (./configure CPPFLAGS = '- D_FILE_OFFSET_BITS = 64'), который "работал" (скомпилирован). Конечно, это немного грубо-культовое программирование, потому что я не знаю, почему я должен был это сделать. На самом деле я еще не пытался использовать лептонику, так что она может быть ядром или чем-то еще, потому что я добавил это определение, когда я его построил.

0 голосов
/ 27 апреля 2010

Я предполагаю, что в некоторых случаях у вас есть:

#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.

...