vtable проблема с проектами cppunit и xcode - PullRequest
2 голосов
/ 16 сентября 2009

Я пытаюсь собрать проект zxing iphone и запустить тестовые наборы, которые были написаны в cppunit-1.12.1. Я скопировал код cppunit-1.12.1 внутри проекта и изменил активный SDK на 10.5, я могу построить цели cppunit и zxingcore, но когда я пытаюсь создать цель zxingcore-tests, я получаю следующие ошибки которые связаны с vtables и странным предупреждением, связанным с типом архитектуры библиотеки:

Есть ли хороший способ отформатировать это, в основном избегая форматирования, не вставляя> перед каждой строкой. Я использовал <pre> теги, которые хорошо работали в предварительном просмотре, но не в окончательном рендеринге - не соблюдали форматирование и обрезали текст. Я изменю форматирование, как только кто-нибудь даст мне предложение.


Ld build/Debug/zxingcore-tests normal i386
cd /Users/andres/src/zxing/iphone
setenv MACOSX_DEPLOYMENT_TARGET 10.5
/Developer/usr/bin/g++-4.2 -arch i386 -isysroot /Developer/SDKs/MacOSX10.5.sdk -L/Users/andres/src/zxing/iphone/build/Debug -F/Users/andres/src/zxing/iphone/build/Debug -filelist /Users/andres/src/zxing/iphone/build/ZXing.build/Debug/zxingcore-tests.build/Objects-normal/i386/zxingcore-tests.LinkFileList -mmacosx-version-min=10.5 -lzxingcore -lCppUnit -o /Users/andres/src/zxing/iphone/build/Debug/zxingcore-tests

ld: warning: in /Developer/SDKs/MacOSX10.5.sdk/usr/local/lib/libCppUnit.dylib, file is not of required architecture
ld: warning: common::Counted::Counted()has different visibility (default) in /Users/andres/src/zxing/iphone/build/Debug/libzxingcore.a(GF256.o) and (hidden) in /Users/andres/src/zxing/iphone/build/ZXing.build/Debug/zxingcore-tests.build/Objects-normal/i386/BitSourceTest.o
ld: warning: common::Counted::retain()    has different visibility (default) in /Users/andres/src/zxing/iphone/build/Debug/libzxingcore.a(GF256.o) and (hidden) in /Users/andres/src/zxing/iphone/build/ZXing.build/Debug/zxingcore-tests.build/Objects-normal/i386/BitSourceTest.o
ld: warning: common::ArrayRef::~ArrayRef()has different visibility (default) in /Users/andres/src/zxing/iphone/build/Debug/libzxingcore.a(GF256.o) and (hidden) in /Users/andres/src/zxing/iphone/build/ZXing.build/Debug/zxingcore-tests.build/Objects-normal/i386/ReedSolomonTest.o
ld: warning: std::valarray::operator[](unsigned long)has different visibility (default) in /Users/andres/src/zxing/iphone/build/Debug/libzxingcore.a(GF256.o) and (hidden) in /Users/andres/src/zxing/iphone/build/ZXing.build/Debug/zxingcore-tests.build/Objects-normal/i386/ReedSolomonTest.o
ld: warning: common::ArrayRef::reset(common::Array*)has different visibility (default) in /Users/andres/src/zxing/iphone/build/Debug/libzxingcore.a(GF256.o) and (hidden) in /Users/andres/src/zxing/iphone/build/ZXing.build/Debug/zxingcore-tests.build/Objects-normal/i386/ReedSolomonTest.o
ld: warning: common::ArrayRef::ArrayRef(common::Array*)has different visibility (default) in /Users/andres/src/zxing/iphone/build/Debug/libzxingcore.a(GF256.o) and (hidden) in /Users/andres/src/zxing/iphone/build/ZXing.build/Debug/zxingcore-tests.build/Objects-normal/i386/ReedSolomonTest.o
ld: warning: common::ArrayRef::ArrayRef(common::ArrayRef const&)has different visibility (default) in /Users/andres/src/zxing/iphone/build/Debug/libzxingcore.a(GF256.o) and (hidden) in /Users/andres/src/zxing/iphone/build/ZXing.build/Debug/zxingcore-tests.build/Objects-normal/i386/ReedSolomonTest.o

....many more of these warnings...

А теперь ошибки


Undefined symbols:
  "vtable for CppUnit::TestSuiteBuilderContextBase", referenced from:
      __ZTVN7CppUnit27TestSuiteBuilderContextBaseE$non_lazy_ptr in BitArrayTest.o
      __ZTVN7CppUnit27TestSuiteBuilderContextBaseE$non_lazy_ptr in BitMatrixTest.o
      __ZTVN7CppUnit27TestSuiteBuilderContextBaseE$non_lazy_ptr in BitSourceTest.o
      __ZTVN7CppUnit27TestSuiteBuilderContextBaseE$non_lazy_ptr in BlackPointEstimatorTest.o
      __ZTVN7CppUnit27TestSuiteBuilderContextBaseE$non_lazy_ptr in PerspectiveTransformTest.o
      __ZTVN7CppUnit27TestSuiteBuilderContextBaseE$non_lazy_ptr in ReedSolomonTest.o
      __ZTVN7CppUnit27TestSuiteBuilderContextBaseE$non_lazy_ptr in DataMaskTest.o
      __ZTVN7CppUnit27TestSuiteBuilderContextBaseE$non_lazy_ptr in ErrorCorrectionLevelTest.o
      __ZTVN7CppUnit27TestSuiteBuilderContextBaseE$non_lazy_ptr in FormatInformationTest.o
      __ZTVN7CppUnit27TestSuiteBuilderContextBaseE$non_lazy_ptr in ModeTest.o
      __ZTVN7CppUnit27TestSuiteBuilderContextBaseE$non_lazy_ptr in VersionTest.o
  "CppUnit::TestLeaf::doGetChildTestAt(int) const", referenced from:
      vtable for CppUnit::TestCaller in BitArrayTest.o
      vtable for CppUnit::TestCaller in BitMatrixTest.o
      vtable for CppUnit::TestCaller in BitSourceTest.o
      vtable for CppUnit::TestCaller in BlackPointEstimatorTest.o
      vtable for CppUnit::TestCaller in PerspectiveTransformTest.o
      vtable for CppUnit::TestCaller  in ReedSolomonTest.o
      vtable for CppUnit::TestCallerin DataMaskTest.o
      vtable for CppUnit::TestCallerin ErrorCorrectionLevelTest.o
      vtable for CppUnit::TestCallerin FormatInformationTest.o
      vtable for CppUnit::TestCallerin ModeTest.o
      vtable for CppUnit::TestCallerin VersionTest.o
  "typeinfo for CppUnit::TestCase", referenced from:
      typeinfo for CppUnit::TestCallerin BitArrayTest.o
      typeinfo for CppUnit::TestCallerin BitMatrixTest.o
      typeinfo for CppUnit::TestCallerin BitSourceTest.o
      typeinfo for CppUnit::TestCallerin BlackPointEstimatorTest.o
      typeinfo for CppUnit::TestCallerin PerspectiveTransformTest.o
      typeinfo for CppUnit::TestCallerin ReedSolomonTest.o
      typeinfo for CppUnit::TestCallerin DataMaskTest.o
      typeinfo for CppUnit::TestCallerin ErrorCorrectionLevelTest.o
      typeinfo for CppUnit::TestCallerin FormatInformationTest.o
      typeinfo for CppUnit::TestCallerin ModeTest.o
      typeinfo for CppUnit::TestCallerin VersionTest.o
  "CppUnit::TestLeaf::countTestCases() const", referenced from:
      vtable for CppUnit::TestCaller in BitArrayTest.o
      vtable for CppUnit::TestCaller in BitMatrixTest.o
      vtable for CppUnit::TestCaller in BitSourceTest.o
      vtable for CppUnit::TestCaller in BlackPointEstimatorTest.o
      vtable for CppUnit::TestCaller in 
`... lots of these errors ... `
CppUnit::assertEquals(qrcode::decoder::FormatInformation const&, qrcode::decoder::FormatInformation const&, CppUnit::SourceLine, std::basic_string, std::allocator > const&)in FormatInformationTest.o
      void CppUnit::assertEquals(int const&, int const&, CppUnit::SourceLine, std::basic_string, std::allocator > const&)in ModeTest.o
      void CppUnit::assertEquals(qrcode::decoder::Mode* const&, qrcode::decoder::Mode* const&, CppUnit::SourceLine, std::basic_string, std::allocator > const&)in ModeTest.o
      void CppUnit::assertEquals(int const&, int const&, CppUnit::SourceLine, std::basic_string, std::allocator > const&)in VersionTest.o
      void CppUnit::assertEquals(bool const&, bool const&, CppUnit::SourceLine, std::basic_string, std::allocator > const&)in VersionTest.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
 

Ответы [ 3 ]

3 голосов
/ 16 сентября 2009

Хорошо, вот что я думаю, проблема в том, но не цитируйте меня;)

Код cppunit использует макрос CPPUNIT_API, чтобы обернуть

__declspec(dllexport)

и

__declspec(dllimport)

при сборке на Win32. Он не использует эквивалент

__attribute__ ((visibility("default")))

для gcc. Это может вызвать проблемы при включении этого кода в проекты, в которых do используют атрибуты видимости в gcc, особенно когда проект использует флаг gcc командной строки

-fvisibility=hidden

по умолчанию сделать все символы закрытыми для библиотеки и затем использовать

__attribute__((visibility("default")))

вместо __declspec(dllexport/import) в случае необходимости. Если символ, такой как vtable, помечен как скрытый только в одной библиотеке, хотя он помечен как общедоступный во всех других библиотеках, то, по-видимому (см. Ссылку ниже), он помечен как скрытый, и вы получите ошибку компоновщика.

В вашем случае предупреждения компоновщика, которые вы получаете изначально, предполагают, что zxingcore-tests строится с символами, скрытыми по умолчанию (проверьте эту опцию -f при сборке), тогда как сама xzingcore делает их общедоступными. Символы для таблиц cppunit будут существовать в cppunit, zxingcore и zxingcore-tests, но помечены как скрытые в zxingcore-test, и поэтому они будут скрыты.

Я думаю, вам нужно попытаться выяснить, почему сборка zxingcore-tests скрывает символы, и помешать этому.

Для дальнейшего чтения воспользуйтесь страницей * wiki *1040*, в частности, разделом «Проблемы с исключениями в C ++» (и перейдите по ссылке, которая также содержит расплывчатую ссылку, которая показывает, что она применима и к vtables) Я смутно знаком с этим, потому что меня укусили dynamic_cast сбои в библиотеках, которые в этом случае вызваны typeinfo объектами, скрытыми по ошибке.

2 голосов
/ 18 сентября 2009

Думаю, проблема заключалась в том, что библиотеки cppunit и zxingcore создавались для armv6, а тесты zxingcore создавались для архитектуры intel. После изменения параметра конфигурации для zxingcore-tests на NATIVE_ARCH, похоже, он компилируется нормально.

0 голосов
/ 15 июля 2010

Я также сталкивался с подобными проблемами при использовании библиотек. Я смог исправить проблемы, убедившись, что в обеих настройках сборки проекта установлены следующие параметры:

Под целевой информацией - Сборка - GCC 4.2 - Генерация кода:

Убедитесь, что оба параметра «Скрытые встроенные методы» и «Скрытые символы по умолчанию» отключены.

Это может быть что-то вроде техники кувалды, но она работает. Если кто-нибудь может предложить более мелкозернистый способ устранения этой проблемы, я был бы признателен.

...