Проблемы со связью статических библиотек Intel IPP в Linux с g ++ - PullRequest
2 голосов
/ 03 февраля 2009

Я пытался переместить проект из XCode в Linux (пока Ubuntu x86, но, надеюсь, статически связанный исполняемый файл будет работать на компьютере с ОС x86? У меня весь проект компилируется, но на этапе компоновки происходит сбой - он дает мне неопределенные ссылки для всех функций, определенных IPP. Возможно, это что-то очень маленькое и глупое, но я уже несколько дней бьюсь над этим и не могу заставить его работать.

Вот инструкция компиляции (у меня также есть make-файл, который генерирует те же ошибки):

г ++ -статик /opt/intel/ipp/6.0.1.071/ia32/lib/libippiemerged.a /opt/intel/ipp/6.0.1.071/ia32/lib/libippimerged.a /opt/intel/ipp/6.0.1.071/ia32/lib/libippsemerged.a /opt/intel/ipp/6.0.1.071/ia32/lib/libippsmerged.a /opt/intel/ipp/6.0.1.071/ia32/lib/libippcore.a -pthread -I /opt/intel/ipp/6.0.1.071/ia32/include -I tools / include -o main main.cpp pick_peak.cpp get_starting_segments.cpp get_segment_timing_differences.cpp recast_and_normalize_wave_file.cpp rhythm_score.cpp pitch_score.cpp pitch_curve.cpp инструменты / источник / LocalBuffer.cpp tools / source / wave.cpp distance.cpp

... и вот начало длинного списка ошибок компоновщика:

./main.o: In function `main':
main.cpp:(.text+0x13f): undefined reference to `ippsMalloc_16s'
main.cpp:(.text+0x166): undefined reference to `ippsMalloc_32f'
main.cpp:(.text+0x213): undefined reference to `ippsMalloc_16s'

Есть идеи? Кстати, это зависимости IPP в моем проекте XCode, который создает, связывает и запускает без проблем: «-lippiemerged», "-Lippimerged", "-Lippsemerged", "-Lippsmerged", "-Lippcore",

Спасибо!

Ответы [ 2 ]

1 голос
/ 07 февраля 2009

Ваша проблема со связыванием, вероятно, связана с тем, что ваша линия связи полностью задом наперед: архивные библиотеки должны следовать исходным и объектным файлам в командной строке, а не предшествовать им. Чтобы понять, почему заказ имеет значение, прочитайте this .

Также обратите внимание, что в Linux статически связанные исполняемые файлы значительно менее переносимы, чем динамически связанные. В общем, если вы динамически связываете системные библиотеки в более старой системе Linux, это будет работать на всех более новых системах (я использую древний RedHat 6.2, и я не видел систему, на которой мой исполняемый файл не будет работать). Это не верно для полностью статических исполняемых файлов; они могут потерпеть крах любыми «интересными» способами при перемещении в систему с библиотекой, отличной от той, с которой они были связаны.

1 голос
/ 03 февраля 2009

У меня были проблемы со связыванием кода с v 6 ipp; используя версию компилятора v11 (с включенными обновлениями в ipp), загадочным образом их исправили. Конечно, это было на платформе Windows, но я получал версии функций 8u для компиляции и не 32f версии, несмотря на то, что обе они указаны в документации как действительные.

...