Связывание GraphicsMagick на Mac OSX 10.8 с помощью clang и libStack Overflow

Я пытался включить GraphicsMagick в мой проект за последние пару дней, но без удачи, надеюсь, кто-то здесь сможет мне помочь (см. TL / DR в конце, если это слишком долго).

Как мне нужно JPEG, PNG и ЖХМС Поддержка, я ранее скачал и собрал их, используя инструменты configure и make:

./configure CC=clang
make
sudo make install

Все это работает нормально, поэтому после загрузки GraphicsMagick я снова запускаю configure:

CC=clang CXX="clang++ -stdlib=libc++" CXXFLAGS="-stdlib=libc++" LDFLAGS="-stdlib=libc++" ./configure --enable-shared --disable-static --disable-openmp --without-xml --without-zlib --without-bzlib

затем make создает мои динамические библиотеки: libGraphicsMagick.3.dylib а также libGraphicsMagick++.3.dylib, Когда я проверяю libGraphicsMagick ++ с MacDependency или с otoolЯ вижу, что он ссылается на /usr/lib/libc++.1.dylib (а не на libstdc ++)

Теперь, если я создаю новый проект с использованием GraphicsMagick, добавьте #include <Magick++.h> (устанавливается предыдущим шагом в / usr / local / include / GraphicsMagick), просто, не используя какую-либо функцию, я получаю ошибку ссылки:

clang++ -headerpad_max_install_names -stdlib=libc++ -arch x86_64 -o TestMagickApp.app/Contents/MacOS/TestMagickApp main.o widget.o moc_widget.o   -F/Library/Frameworks -L/Library/Frameworks -framework QtGui -framework QtCore
Undefined symbols for architecture x86_64:
"std::__1::basic_streambuf<char, std::__1::char_traits<char> >::gptr() const", referenced from:
std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::seekoff(long long, std::__1::ios_base::seekdir, unsigned int) in widget.o
std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::underflow() in widget.o
std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::pbackfail(int) in widget.o
std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::overflow(int) in widget.o
"std::__1::basic_streambuf<char, std::__1::char_traits<char> >::pptr() const", referenced from:
std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::seekoff(long long, std::__1::ios_base::seekdir, unsigned int) in widget.o
std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::underflow() in widget.o
std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::pbackfail(int) in widget.o
std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::overflow(int) in widget.o
"std::__1::basic_streambuf<char, std::__1::char_traits<char> >::eback() const", referenced from:
std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::seekoff(long long, std::__1::ios_base::seekdir, unsigned int) in widget.o
std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::underflow() in widget.o
std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::pbackfail(int) in widget.o
std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::overflow(int) in widget.o
"std::__1::basic_streambuf<char, std::__1::char_traits<char> >::egptr() const", referenced from:
std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::underflow() in widget.o
"std::__1::basic_streambuf<char, std::__1::char_traits<char> >::epptr() const", referenced from:
std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::seekoff(long long, std::__1::ios_base::seekdir, unsigned int) in widget.o
std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::overflow(int) in widget.o
"std::__1::basic_streambuf<char, std::__1::char_traits<char> >::pbase() const", referenced from:
std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::seekoff(long long, std::__1::ios_base::seekdir, unsigned int) in widget.o
std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::overflow(int) in widget.o
"std::__1::basic_iostream<char, std::__1::char_traits<char> >::basic_iostream(std::__1::basic_streambuf<char, std::__1::char_traits<char> >*)", referenced from:
std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_stringstream(unsigned int) in widget.o
"std::__1::basic_streambuf<char, std::__1::char_traits<char> >::setg(char*, char*, char*)", referenced from:
std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::seekoff(long long, std::__1::ios_base::seekdir, unsigned int) in widget.o
std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::underflow() in widget.o
std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::pbackfail(int) in widget.o
std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::overflow(int) in widget.o
std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::str(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in widget.o
"std::__1::basic_streambuf<char, std::__1::char_traits<char> >::setp(char*, char*)", referenced from:
std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::seekoff(long long, std::__1::ios_base::seekdir, unsigned int) in widget.o
std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::overflow(int) in widget.o
std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::str(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in widget.o
"std::__1::basic_streambuf<char, std::__1::char_traits<char> >::pbump(int)", referenced from:
std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::seekoff(long long, std::__1::ios_base::seekdir, unsigned int) in widget.o
std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::overflow(int) in widget.o
std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::str(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in widget.o
"std::__1::basic_streambuf<char, std::__1::char_traits<char> >::sputc(char)", referenced from:
std::__1::basic_stringbuf<char, std::__1::char_traits<char>, std::__1::allocator<char> >::overflow(int) in widget.o
"std::__1::basic_ios<char, std::__1::char_traits<char> >::basic_ios()", referenced from:
std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_stringstream(unsigned int) in widget.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [TestMagickApp.app/Contents/MacOS/TestMagickApp] Error 1
19:43:22: The process "/usr/bin/make" exited with code 2.
Error while building/deploying project TestMagickApp (kit: 4.8.5)
When executing step 'Make'

Но это происходит только тогда, когда я пытаюсь использовать libc ++, если я пытаюсь использовать вместо этого libstdc ++, он связывается без каких-либо проблем (но он должен выдавать ошибку, как только я пытаюсь использовать какую-либо функцию, если я все еще думаю прямо).

Я попытался включить только определенные файлы, чтобы сузить проблему, и кажется, что это вызвано этим фрагментом кода внутри /usr/local/include/GraphicsMagick/magick/common.h:

/*
Support for __attribute__ was added in GCC 2.0.  It is not supported
in strict ANSI mode which is indicated by __STRICT_ANSI__ being
defined.

http://www.ohse.de/uwe/articles/gcc-attributes.html

Note that GCC 3.2 on MinGW does not define __GNUC__ or __GNUC_MINOR__.

*/
#if !defined(__attribute__)
#  if (!defined(__GNUC__) || (__GNUC__ < 2 || __STRICT_ANSI__))
#    define __attribute__(x) /*nothing*/
#  else
#    if (((__GNUC__) > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1))) /* 3.1+ */
#      define MAGICK_FUNC_DEPRECATED __attribute__((__deprecated__))
#    endif
#    if (__GNUC__ >= 3)  /* 3.0+ */
#      define MAGICK_FUNC_MALLOC __attribute__((__malloc__))
#    endif
#    if (((__GNUC__) > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)))  /* 3.3+ */
/* Supports argument syntax like __attribute__((nonnull (1, 2))) but
don't know how to support non-GCC fallback. */
#      define MAGICK_FUNC_NONNULL __attribute__((__nonnull__))
#    endif
#    if (((__GNUC__) > 3) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 5))) /* 2.5+ */
#      define MAGICK_FUNC_NORETURN __attribute__((__noreturn__))
#    endif
#    if ((__GNUC__) >= 3) /* 2.96+ */
#      define MAGICK_FUNC_PURE __attribute__((__pure__))
#    endif
#    if (((__GNUC__) > 3) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 7))) /* 2.7+ */
#      define MAGICK_FUNC_UNUSED __attribute__((__unused__))
#    endif
#    if (((__GNUC__) > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)))  /* 3.3+ */
#      define MAGICK_FUNC_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__))
#    endif
#    if (((__GNUC__) > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)))  /* 4.3+ */
#      define MAGICK_FUNC_ALLOC_SIZE_1ARG(arg_num) __attribute__((__alloc_size__(arg_num)))
#      define MAGICK_FUNC_ALLOC_SIZE_2ARG(arg_num1,arg_num2) __attribute__((__alloc_size__(arg_num1,arg_num2)))
#      define MAGICK_FUNC_HOT __attribute__((__hot__))
#      define MAGICK_FUNC_COLD __attribute__((__cold__))
#      define MAGICK_OPTIMIZE_FUNC(opt) __attribute__((__optimize__ (opt)))
#    endif
#    if (((__GNUC__) > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)))  /* 4.7+ */
#      define MAGICK_ASSUME_ALIGNED(exp,align) __builtin_assume_aligned(exp,align)
#      define MAGICK_ASSUME_ALIGNED_OFFSET(exp,align,offset) __builtin_assume_aligned(exp,align,offset)
#    endif
#  endif
#endif

Сейчас я не совсем понимаю этот код, но, похоже, он включает поддержку действительно старых компиляторов (версия GCC < 2 !!). Если я закомментирую весь раздел, он, кажется, скомпилируется нормально, но, поскольку я не знаю, что он делает, комментировать его кажется немного рискованным / странным, и, поскольку это файл только для чтения, он как бы указывает на то, что мне следует Я не думаю, что в действительности все равно.

Для чего бы то ни было, приложение, использующее GraphicsMagick, также использует Qt 4.8.5, и я использую QtCreator и QMake, но я не думаю, что это уместно здесь. Я пытался с Qt 5.1 и 5.2, но без удачи.

clang++ --version возвращается Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn) (Я знаю, что это не последняя версия, но я бы не стал ее менять).

TL / DR:

У кого-нибудь есть опыт / отзывы по компиляции GraphicsMagick с libc ++?

Может кто-нибудь объяснить мне, что делает последний бит кода выше? И почему это работает, когда я это комментирую?

Можете ли вы заметить что-то не так в том, что я сделал? Я сделал весь процесс несколько раз, но, возможно, я забыл что-то очевидное …

Любая помощь будет приветствоваться.

0

Решение

Конфигурация для clang была добавлена ​​с последней стабильной версии (1.3.19 на сегодняшний день). Здание от ртутный решил эту проблему.

0

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

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

По вопросам рекламы [email protected]