2014-04-01 52 views
0

在過去的幾天裏,我一直試圖將GraphicsMagick加入到我的項目中,但沒有運氣,希望這裏有人能夠幫助我(最後參見TL/DR如果這太長)。在Mac OSX 10.8上使用clang和libC++連接GraphicsMagick

,因爲我需要JPEG,PNG和lcms支持,我以前下載並使用配置建站,使工具:

./configure CC=clang 
make 
sudo make install 

這一切似乎在下載GraphicsMagick工具後工作正常,所以,我跑配置再次:

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.dyliblibGraphicsMagick++.3.dylib。當我檢查libGraphicsMagick ++與MacDependencyotool,我看到它是連接對/usr/lib/libc++.1.dylib(而不是的libstdC++)

現在,如果我創建使用GraphicsMagick工具一個新的項目,添加#include <Magick++.h>(安裝在上一步驟中的/ usr /本地/包括/ 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,但沒有運氣。 (我知道這不是最新版本,但我寧願不改變它)。

TL/DR:

有沒有人有上的libC++編譯GraphicsMagick工具的任何經驗/反饋?

有人可以向我解釋上面的代碼是在做什麼?當我評論它時爲什麼會起作用?

你能發現我做了什麼錯嗎?我做了整個過程幾次,但也許我忘了一些明顯的...

任何幫助將是非常歡迎。

+0

你確定Qt組件沒有鏈接到'libstdC++'庫嗎? –

+0

我不這麼認爲,我將'-stdlib = libC++'傳遞給編譯器和鏈接器(使用'QMAKE_CXXFLAGS'和'QMAKE_LFLAGS'),並且在構建輸出中,我可以在傳遞給clang ++的選項中看到它。奇怪的是,如果我*不通過這個標誌,它似乎工作(但我認爲它也不能解決問題,而且我需要在我的項目上使用libC++)。 – Uflex

回答

0

自上一個穩定版本(截至今日1.3.19)以來,clang的配置已被添加。從Mercurial建設解決了這個問題。