Хорошо, вот что я думаю, проблема в том, но не цитируйте меня;)
Код 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
объектами, скрытыми по ошибке.