Я пытаюсь линковать общую библиотеку, которая имеет несколько различных реализаций - в частности, 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
, поэтому я рекомендую следующее:
- Убедитесь, что ваше приложение связано с
libblas.so.3
, как это уже сделано. В целевой системе создайте символическую ссылку из фактического 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