2013-04-18 1 views
0

источник: SVN Checkout SVN: //dev.exiv2.org/svn/trunk (Latest оборотов: 3020)Макро в GCC работает, но в компиляторе Solaris не удается?

Моя платформа: Fedora 17 64-разрядное

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

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

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

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 Составитель: http://dev.exiv2.org/projects/exiv2/repository/revisions/3020/diff?rev=3020&type=sbs

Как игнорировать множественные ошибки в декларации Solaris компилятора?

Я вычислил диф из предварительно обработанного выхода из .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

Посмотрите на предварительно обработанный исходный код, и вы увидите, что вы определяете переменную дважды. – PlasmaHH

+0

Но тогда почему GCC не бросает эту ошибку? Как я могу его исправить? См. Разницу. Макрос OS_SOLARIS является обязательным для ОС Solaris –

+0

Очевидно, что GCC не сообщает об этой ошибке. Стандарт C не гарантирует, что компиляторы поймают все ваши ошибки; он делает это только для подмножества. Одно правило определения (ODR) не является частью этого подмножества. – MSalters

ответ

1

Я отправил комментарий по этому вопросу 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.

+0

Пожалуйста, взгляните на это тоже http://stackoverflow.com/questions/16088950/gcc-compiles-fine-but-solaris-compiler-doesnt –

 Смежные вопросы

  • Нет связанных вопросов^_^