источник: 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
>) ; }
Посмотрите на предварительно обработанный исходный код, и вы увидите, что вы определяете переменную дважды. – PlasmaHH
Но тогда почему GCC не бросает эту ошибку? Как я могу его исправить? См. Разницу. Макрос OS_SOLARIS является обязательным для ОС Solaris –
Очевидно, что GCC не сообщает об этой ошибке. Стандарт C не гарантирует, что компиляторы поймают все ваши ошибки; он делает это только для подмножества. Одно правило определения (ODR) не является частью этого подмножества. – MSalters