ImageMagick pthread.h多重定义

时间:2014-07-15 21:36:17

标签: c++ c pthreads imagemagick glibc

当尝试编译更新版本的ImageMagick(v6.8.7-2或更高版本,v6.8.7-1没问题)时,我得到了一堆:

CCLD     magick/libMagickCore-6.Q16.la
magick/.libs/magick_libMagickCore_6_Q16_la-animate.o: In function `__pthread_cleanup_routine':
/usr/include/pthread.h:581: multiple definition of `__pthread_cleanup_routine'
magick/.libs/magick_libMagickCore_6_Q16_la-accelerate.o:/usr/include/pthread.h:581: first defined here
magick/.libs/magick_libMagickCore_6_Q16_la-annotate.o: In function `__pthread_cleanup_routine':
/usr/include/pthread.h:581: multiple definition of `__pthread_cleanup_routine'
magick/.libs/magick_libMagickCore_6_Q16_la-accelerate.o:/usr/include/pthread.h:581: first defined here
magick/.libs/magick_libMagickCore_6_Q16_la-artifact.o: In function `__pthread_cleanup_routine':
/usr/include/pthread.h:581: multiple definition of `__pthread_cleanup_routine'
magick/.libs/magick_libMagickCore_6_Q16_la-accelerate.o:/usr/include/pthread.h:581: first defined here
magick/.libs/magick_libMagickCore_6_Q16_la-attribute.o: In function `__pthread_cleanup_routine':
/usr/include/pthread.h:581: multiple definition of `__pthread_cleanup_routine'
magick/.libs/magick_libMagickCore_6_Q16_la-accelerate.o:/usr/include/pthread.h:581: first defined here
... goes on for quite a bit longer, all the same.

/usr/include/pthread.h的相关区域(来自glibc-headers 2.5-118.el5_10.2)是:

/* Function called to call the cleanup handler.  As an extern inline
function the compiler is free to decide inlining the change when
needed or fall back on the copy which must exist somewhere else.  */

extern __inline void
__pthread_cleanup_routine (struct __pthread_cleanup_frame *__frame)
{
  if (__frame->__do_it) // <======= this is :581
    __frame->__cancel_routine (__frame->__cancel_arg);
}

我一直在ImageMagick的论坛上发帖而没有回应。

即使您无法确切地说出发生了什么,我该如何开始确定问题是与ImageMagick还是pthread.h有关?我从哪里去?

grep pthread_cleanup_routine -r *仅显示与二进制对象文件的匹配 - ImageMagick的源代码中没有一个包含pthread_cleanup_routine。一些来源包括&#34; pthread.h&#34;当然。

这让我相信这是一个glibc问题,而不是ImageMagick问题......但是,同样,以前版本的ImageMagick编译得很好。 (我对它破坏的版本之间的svn源进行了差异化。很多配置/ makefile的更改,但没有任何内容可以解释为什么会导致这种情况。)

我在CentOS 5上,内核2.6.18-308.24.1.el5,gcc v4.9.0,ld v2.24,glibc-headers 2.5-118.el5_10.2

2 个答案:

答案 0 :(得分:1)

我见过很多人发布与其他软件包类似的问题而不是ImageMagick。希望其他人会觉得这很有用。

在__pthread_cleanup_routine:

之前更改pthread.h
extern __inline void

if __STDC__VERSION__ < 199901L
extern
#endif
__inline void

修复了这个问题。较旧版本的glibc在使用-fexceptions和内联非C99一致性时会出现问题(请参阅http://gcc.gnu.org/ml/gcc-patches/2006-11/msg01030.html。)更新的glibc也可以解决这个问题,但这对于那些人来说应该是一个临时修复谁不想/不应该升级它。

ImageMagick svn 13539(后来成为v6.8.7-2)开始使用-fexceptions。

答案 1 :(得分:0)

我使用较新的gcc编译器(4.9.3)

时遇到此错误

ImageMagick(6.8.9_7)配置脚本正在检查编译器是否支持gnu99标准。如果是,则configure脚本将标准设置为gnu99,并启用openmp。

内联语义随C标准gnu99而变化,导致extern内联函数的多重定义 https://gcc.gnu.org/onlinedocs/gcc-4.9.3/gcc/Inline.html#Inline

所以,我添加了编译器标志-fgnu89-inline来使用内联的旧语义,它解决了这个问题。