2015-01-19 4 views
0

У меня возникла проблема с cmake и ссылкой на мое приложение: Я работаю над существующим проектом. В этом проекте используется модифицированный libjpeg (статический lib), и мой исполняемый файл связан с ним.Ссылка на две аналогичные библиотеки с cmake

target_link_libraries(myprog jpeglib) 

Теперь я хочу добавить новую функцию, которая использует turbojpeg lib.

add_library(newfeature SHARED ${LIBVNCSERVER_SOURCES}) 
set_target_properties(newfeature PROPERTIES DEFINE_SYMBOL DLLDEFINE) 
target_link_libraries(newfeature turbojpeg-static) 
target_link_libraries(newfeature LINK_INTERFACE_LIBRARIES) 

Моя программа будет связана с этой общей библиотеки:

target_link_libraries (myprog jpeglib newfeature) 

В Windows все работает отлично. Но если я использую эту функцию под Linux, я получаю сообщение об ошибке:

JPEG Error: JPEG parameter struct mismatch: library thinks size is 488, caller expects 504 

Эта ошибка возникает из libjpeg.

Все, что я нашел в Google, не работает. Я предполагаю, что в новой библиотеке newfeature используется jpeglib из myprog, хотя newfeature статически связана с turbojpeg lib. newfeature должен быть автономным .so или .dll файлом Если бы я изменил порядок привязки, я получил ту же ошибку, но он генерируется из turbojpeg.

Связывание myprog с turbojpeg-static невозможно, поскольку оно несовместимо с модифицированным libjpeg.

Может ли кто-нибудь помочь? Правильно ли мое предположение?

+1

Эта ошибка возникает, когда вы вызываете функцию 'jpeglib' или' newfeature'? Похоже, что ваша библиотека 'turbojpeg' просто может быть перестроена против той же базовой версии' libjpeg', которую вы использовали ранее. –

+0

Ошибка возникает, когда я вызываю функцию newfeature. Я попробую перестроить, спасибо за подсказку – plettix

ответ

0

Я нашел решение:

я добавил --exclude-libs,ALL к команде компоновщика из newfeature с помощью этой команды CMake:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wl,--exclude-libs,ALL") 

Проблема в том, что символы из моей turbojpeg-static были экспортированы моей newfeature.so и, следовательно, видимый от «снаружи». Линкер сначала находит символы из libjpeg. При привязке myprog к newfeature.so компоновщик находит ссылки от моих методов newfeature до turbojpeg-static и перезаписывает их.

Надеюсь, я смогу помочь другим с одинаковой проблемой. Пожалуйста, дайте мне знать, если что-то неясно или неправильно.

2

Проблема заключается в том, что вы статически связываете libjpeg с исполняемым файлом, но теперь вы пытаетесь добавить косвенную зависимость от (libjpeg-turbo), что является другой реализацией того же API.

Это проблема, потому что теперь есть два возможных разрешения для каждого общедоступного символа API (имя функции и т. Д.) В API libjpeg. Большинство библиотек не поддерживают две версии себя в одном исполняемом файле, и, разумеется, две разные библиотеки, реализующие один и тот же интерфейс, вряд ли это сделают.

Если вам повезло, что libjpeg проверяет версию из своих файлов заголовков (во время сборки) на свою библиотеку (во время выполнения). Такая проблема часто остается незамеченной, когда библиотеки не строят эти проверки.

Вам следует попытаться сделать newfeature зависимым не от libjpeg-turbo и вместо этого удовлетворить его собственным libjpeg, который, как представляется, является фиксированным требованием от вашего описания.

+0

Мне интересно, потому что 'newfeature' shared lib связан с' turbojpeg' и должен быть независим от 'libjpeg', который статически связан с' myprog' – plettix

+0

Можете ли вы уточнить, какие из них вы используете? http://www.libjpeg-turbo.org/About/TurboJPEG - "turbojpeg" или "libjpeg-turbo"? Такое запутанное имя! Вы говорите, что используете «turbojpeg», но реализовано ли оно «libjpeg-turbo» или вы используете другую реализацию? –

+0

Извините за это, я использую библиотеку libjpeg-turbo C (и переименовал ее) – plettix

Смежные вопросы