Макрос в GCC работает, но в Solaris не работает компилятор?

источник: svn checkout svn: //dev.exiv2.org/svn/trunk (последняя редакция: 3020)

Моя платформа: Fedora 17 64-bit

Следующая команда работает:

cmake -DCMAKE_CXX_FLAGS=-library=stlport4 -
DCMAKE_CXX_COMPILER=/opt/oracle/solarisstudio12.3/bin/CC -
DCMAKE_C_COMPILER=/opt/oracle/solarisstudio12.3/bin/cc .

Но после этого, когда я делаю make, я получаю ошибку:

Scanning dependencies of target exiv2lib
[ 17%] Building CXX object src/CMakeFiles/exiv2lib.dir/asfvideo.cpp.o
cd /home/Wani/GSoC/exiv2-trunk/trunk/src && /opt/oracle/solarisstudio12.3/bin/CC   -
DEXV_BUILDING_LIB -DEXV_HAVE_DLL -DEXV_LOCALEDIR=\"/usr/local/share/locale\" -
DEXV_HAVE_STDINT_H -library=stlport4 -KPIC -I/home/Wani/GSoC/exiv2-trunk/trunk -
I/home/Wani/GSoC/exiv2-trunk/trunk/xmpsdk/include    -o
CMakeFiles/exiv2lib.dir/asfvideo.cpp.o -c /home/Wani/GSoC/exiv2-
trunk/trunk/src/asfvideo.cpp
"/home/Wani/GSoC/exiv2-trunk/trunk/src/error.cpp", line 29: Error: Multiple declaration
for rcsId.
1 Error(s) detected.

Содержание error.cpp:

28 #include "rcsid_int.hpp"29 EXIV2_RCSID("@(#) $Id: error.cpp 2681 2012-03-22 15:19:35Z ahuggel $")

Содержимое файла rcsid_int.hpp:

#ifndef RCSID_INT_HPP_
#define RCSID_INT_HPP_

#if !defined (EXIV2_RCSID)
#if defined(__clang__)
#define EXIV2_RCSID(id)

#elif defined(OS_SOLARIS)
#define EXIV2_RCSID(id) \
{ \
inline const char* getRcsId(const char*) { return id ; } \
const char* rcsId = getRcsId(rcsId); \
}

#else
#define EXIV2_RCSID(id) \
namespace { \
inline const char* getRcsId(const char*) { return id ; } \
const char* rcsId = getRcsId(rcsId); \
}
#endif

#endif
#endif

Если я компилирую ту же программу, используя GCC, она работает без ошибок.

См. Различие, поскольку Rev 3019 работает в GCC и Solaris Compiler: http://dev.exiv2.org/projects/exiv2/repository/revisions/3020/diff?rev=3020&тип = СБС

Как игнорировать ошибку множественного объявления в Solaris Compiler?

Я рассчитал разность предварительно обработанного вывода файлов .cpp в r3018 и r3019:

 2a3,6
> #30 "/home/Wani/exiv2-trunk/trunk/src/asfvideo.cpp"> namespace { inline const char * getRcsId ( const char * ) { return "@(#) $Id$" ; }
const char * rcsId = getRcsId ( rcsId
> #30
> ) ; }

0

Решение

Я разместил комментарий по этому вопросу в вики exiv2.org и предоставил патч
который работал мимо проблемы.

Существенной проблемой является то, что компиляторы Solaris Studio делают не разрешить многострочное
макросы в C ++. Патч, который я предоставил, исключил это, потому что он
полнота объявления rcsId.

Насколько я могу определить, правильное объявление в rcsid_int.hpp выглядит следующим образом:

#if defined(__clang__) || (defined(OS_SOLARIS) && defined(__SUNPRO_CC))
#define EXIV2_RCSID(id)
#else
#define EXIV2_RCSID(id) \
namespace { \
inline const char* getRcsId(const char*) { return id ; } \
const char* rcsId = getRcsId(rcsId); \
}
#endif

Это приводит к предварительно обработанному источнику не содержащий строку rcsId.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector