2013-07-10 118 views
1

我試圖在Ubuntu 12.04 x64上編譯應用程序。 它是建立在OSX的鏗鏘聲3.2,使用新的C++ 11標準,並具有依賴性來提升和GraphicsMagick ++並且運行良好。 使用gcc 4.8.1進行編譯導致編譯器崩潰。不幸的是,我們不得不盡快發佈軟件,不能等待gcc修復這些錯誤。在Linux上將GraphicsMagick ++與clang libC++鏈接

經過在linux上通過clang進行一些試驗和錯誤,並通過一些郵件列表閱讀後,我按照這篇文章https://plus.google.com/u/0/+DeWittClinton/posts/Vr7y8TPsKgR進行管理,使用clang 3.3和libC++(和libC++ abi)進行編譯。所有與boost相關的單元測試(僅頭文件和共享庫文件)都執行得很好。 在我們開始鏈接到GraphicsMagick ++之後,它會在下面導致未定義的引用錯誤。

"/usr/bin/ld" -export-dynamic -z relro --hash-style=gnu --build-id --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o ../test_xxx_import /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o -L/usr/local/lib/ -L/usr/lib/gcc/x86_64-linux-gnu/4.8 -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu -L/lib/x86_64-linux-gnu -L/lib/../lib64 -L/usr/lib/x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../.. -L/lib -L/usr/lib -lc++ -lc++abi CMakeFiles/test_xxx_import.dir/xxx_http_binding_test.cpp.o CMakeFiles/test_xxx_import.dir/resource_test.cpp.o CMakeFiles/test_xxx_import.dir/slugify_test.cpp.o CMakeFiles/test_xxx_import.dir/product_test.cpp.o CMakeFiles/test_xxx_import.dir/field_semantic_test.cpp.o CMakeFiles/test_xxx_import.dir/files.index-parser_test.cpp.o CMakeFiles/test_xxx_import.dir/thread_pool_test.cpp.o CMakeFiles/test_xxx_import.dir/container_sink_test.cpp.o CMakeFiles/test_xxx_import.dir/factories_test.cpp.o CMakeFiles/test_xxx_import.dir/thread_safe_queue_test.cpp.o CMakeFiles/test_xxx_import.dir/container_device_test.cpp.o CMakeFiles/test_xxx_import.dir/product_catalog_test.cpp.o CMakeFiles/test_xxx_import.dir/config_object_test.cpp.o CMakeFiles/test_xxx_import.dir/sha1_test.cpp.o CMakeFiles/test_xxx_import.dir/resize_test.cpp.o CMakeFiles/test_xxx_import.dir/redis_connection_test.cpp.o CMakeFiles/test_xxx_import.dir/redis_util_test.cpp.o CMakeFiles/test_xxx_import.dir/redis_product_test.cpp.o CMakeFiles/test_xxx_import.dir/redis_string_util_test.cpp.o CMakeFiles/test_xxx_import.dir/redis_task_queue_test.cpp.o CMakeFiles/test_xxx_import.dir/stream_manipulator_test.cpp.o CMakeFiles/test_xxx_import.dir/category_info_test.cpp.o CMakeFiles/test_xxx_import.dir/localized_string_test.cpp.o CMakeFiles/test_xxx_import.dir/product_description_test.cpp.o CMakeFiles/test_xxx_import.dir/product_picture_test.cpp.o CMakeFiles/test_xxx_import.dir/product_relation_test.cpp.o CMakeFiles/test_xxx_import.dir/supplier_test.cpp.o CMakeFiles/test_xxx_import.dir/summary_description_test.cpp.o CMakeFiles/test_xxx_import.dir/summary_descriptions_test.cpp.o CMakeFiles/test_xxx_import.dir/stage_base_test.cpp.o CMakeFiles/test_xxx_import.dir/thread_reclaimer_test.cpp.o CMakeFiles/test_xxx_import.dir/product_sheet_download_test.cpp.o CMakeFiles/test_xxx_import.dir/image_scaling_test.cpp.o CMakeFiles/test_xxx_import.dir/image_download_test.cpp.o CMakeFiles/test_xxx_import.dir/product_data_sheet_parser_test.cpp.o ../libxxx_import.a /usr/local/lib/libboost_unit_test_framework.a /usr/local/lib/libboost_thread.a /usr/local/lib/libboost_date_time.a /usr/local/lib/libGraphicsMagick++.a /usr/local/lib/libboost_filesystem.a /usr/local/lib/libboost_system.a /usr/local/lib/libboost_exception.a /usr/local/lib/libboost_chrono.a /usr/local/lib/libboost_log.a /usr/local/lib/libPocoNet.so /usr/local/lib/libPocoFoundation.so /usr/local/lib/libPocoNetSSL.so /usr/local/lib/libPocoUtil.so -Bstatic -lexpat -lhiredis -Bdynamic /usr/local/lib/libboost_date_time.a /usr/local/lib/libGraphicsMagick++.a -rpath /usr/local/lib -lc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o 
/usr/local/lib/libGraphicsMagick++.a(Image.o): In function `Magick::Image::signature(bool) const': 
/home/xxx_import/temp/GraphicsMagick-1.3.18/Magick++/lib/Image.cpp:3271: undefined reference to `GetImageAttribute' 
/home/xxx_import/temp/GraphicsMagick-1.3.18/Magick++/lib/Image.cpp:3274: undefined reference to `SignatureImage' 
/home/xxx_import/temp/GraphicsMagick-1.3.18/Magick++/lib/Image.cpp:3278: undefined reference to `GetImageAttribute' 
/usr/local/lib/libGraphicsMagick++.a(Image.o): In function `Magick::Image::read(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)': 

GraphicsMagick工具-1.3.18配置了以下調用:

CC=clang CXX=clang++ ./configure --with-jbig=yes --with-png=yes --with-jpeg=yes --enable-shared=yes CXXFLAGS="-O2 -g -stdlib=libc++ -isystem /usr/local/include/c++/v1/" LDFLAGS="-stdlib=libc++ -L/usr/local/lib/ -R/usr/local/lib/" LIBS="-lc++ -lc++abi" 

事後建造和安裝。

仰視手動發現爲未定義的符號:

nm /usr/local/lib/libGraphicsMagick++.a | grep GetImageAttribute 
       U GetImageAttribute 

屬性在/usr/local/lib/libGraphicsMagick.a找到。

我LDD輸出如下:

ldd /usr/local/lib/libGraphicsMagick++.so 
linux-vdso.so.1 => (0x00007fff78592000) 
libGraphicsMagick.so.3 => /usr/local/lib/libGraphicsMagick.so.3 (0x00007fd0b0309000) 
libjpeg.so.8 => /usr/lib/x86_64-linux-gnu/libjpeg.so.8 (0x00007fd0b00b0000) 
libpng12.so.0 => /lib/x86_64-linux-gnu/libpng12.so.0 (0x00007fd0afe87000) 
libbz2.so.1.0 => /lib/x86_64-linux-gnu/libbz2.so.1.0 (0x00007fd0afc77000) 
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fd0afa60000) 
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fd0af842000) 
libc++abi.so.1 => /usr/local/lib/libc++abi.so.1 (0x00007fd0af5f5000) 
libc++.so.1 => /usr/local/lib/libc++.so.1 (0x00007fd0af351000) 
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fd0af054000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd0aec95000) 
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fd0aea7f000) 
/lib64/ld-linux-x86-64.so.2 (0x00007fd0b09c3000) 
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fd0ae876000) 

它連接免受gcc工具一些C庫。我應該用叮噹建造它們嗎? 任何建議都非常受歡迎。

+0

也許解決編譯器崩潰問題比切換到另一個工具鏈更容易。也許回到gcc-4.7系列更容易。 –

+0

無論如何,你應該在源代碼中搜索'GetImageAttribute'定義,確保它被編譯(在.o/.a/.so文件中使用'nm'),然後確保這些對象*他們在鏈接器命令行中。 –

+0

我試過了,發現/usr/local/lib/libGraphicsMagick.a中的符號。正如答案所描述的,我必須明確鏈接到GraphicsMagick和所有依賴關係。 –

回答

0

你是否也顯式鏈接GraphicsMagick ++的依賴關係?我認爲,如果你列舉GraphicsMagick工具的所有依賴++作爲生產可執行文件的依賴關係,可能解決您的問題,所以這些庫鏈接,以及:

-lGraphicsMagick -ljpeg -lpng12 -lbz2 -lz 

,看看你有較少的鏈接錯誤或無。

+0

這就像一個魅力。謝謝!!仍然不知道爲什麼他們自動鏈接到OSX。 –

相關問題