"альтернативы" для общих библиотек? Это вообще работает?

"альтернативы" для общих библиотек? Это вообще работает?

Я пытаюсь линковать общую библиотеку, которая имеет несколько различных реализаций - в частности, blas, openblas и atlas, все они предоставляют один и тот же двоичный интерфейс через /usr/lib/libblas.soальтернативу в Ubuntu 14.04 (и похожую, но не идентичную настройку в 12.04). Когда я использую GCC с -lblasкомпоновщиком, кажется, что на самом деле происходит разрешение через альтернативную ссылку на фактическую реализацию, так - например, если у меня установлен openblas, он будет ссылаться на фактический двоичный файл openblas, и если я затем установлю полученный исполняемый файл в системе, где установлен atlas, динамический компоновщик не сможет загрузить библиотеку, потому что он не увидит альтернативную ссылку.

Есть ли способ заставить GCC использовать «альтернативную» символическую ссылку в качестве цели dl, чтобы она действительно работала так, как update-alternativesзадумано?

решение1

Разрешение символических ссылок здесь является функцией. При разрешении libblas.soв libblas.so.3результирующий исполняемый файл прикрепляется к определенной версии so. (Изменения в версии so, т. е. 3в libblas.so.3происходят, когда двоичный интерфейс библиотеки изменяется обратно-несовместимо, поэтому это желательно.

Проблема, по-видимому, в том, что в вашей целевой системе нет libblas.so.3, поэтому я рекомендую следующее:

  1. Убедитесь, что ваше приложение связано с libblas.so.3, как это уже сделано.
  2. В целевой системе создайте символическую ссылку из фактического libblas.so на требуемое libblas.so.3имя так, чтобы эта символическая ссылка находилась в LD_LIBRARY_PATH:

    mkdir ./mylib
    ln -s /usr/lib/libblas.so ./mylib/libblas.so.3
    LD_LIBRARY_PATH=$PWD/mylib:$LD_LIBRARY_PATH ./myexecutable
    

Связанный контент