правильный порядок связывания с библиотеками ifort и .so - PullRequest
3 голосов
/ 10 октября 2011

У меня есть две сторонние библиотеки A.so и B.so, которые я связываю вместе с моим исполняемым файлом executetable.exe. A.so содержит ошибку, устраняемую B.so, например:

  • A::subroutine1() может произойти сбой с исключением с плавающей точкой при вызове (арифметическая ошибка FP)
  • B::subroutine1() - это фиксированная реализация, которая всегда должна вызываться вместо A::subroutine1().

Каков правильный порядок связывания для A и B? То, что я делаю сейчас:

ifort <....> executable.exe <...> -lA -lB

Время от времени я получаю исключение с плавающей запятой (ошибка не воспроизводится точно, поэтому ее довольно сложно отладить). Тем не менее, когда происходит сбой, программа сообщает мне, что A :: subroutine1 () является нарушителем - поэтому по какой-то причине неверная версия subroutine1 () связана.

Я переверну порядок связывания как первый удар при этом, но есть ли инструмент, который я могу использовать для проверки исполняемого файла.exe, чтобы увидеть, какая версия подпрограммы1 () будет вызываться во время выполнения?

спасибо!

1 Ответ

1 голос
/ 12 октября 2011

Если вы хотите, чтобы subroutine1 из libB.so вызывалось, тогда правильный порядок ссылок будет -lB -lA (для Linux и большинства других реализаций общей библиотеки UNIX).

есть инструментчто я могу использовать для проверки исполняемого файла.exe, чтобы увидеть, какая версия подпрограммы1 () будет вызываться во время выполнения

Нет: эта информация обычно не записывается в исполняемый файл.Правило таково: какая бы общая библиотека ни указала, subroutine1 первым будет тот, который будет использоваться.

Например, если вы связываетесь с -lC -lB -lA, а во время соединения libC.so не делает , не определяют subroutine1, но позже вы перестраиваете libC.so ( без повторного связывания исполняемого файла), так что это произойдет, тогда будет вызван subroutine1 из libC.so.

Однакообратите внимание, что есть осложнения.Например, libA.so может быть связано с -Bsymbolic, что приведет к тому, что все вызовы на subroutine1 из libA.so будут привязаны к subroutine1 внутри libA.so.

...