Я сейчас пытаюсь скомпилировать все мои приложения в виде статической библиотеки. Моя мотивация:
Однако, как я изначально боялся, мне пришлось довольно быстро спуститься в кроличью нору. В настоящее время я застрял с OpenCV, и я уверен, что это еще не все. Тем не мение, мои основные вопросы являются:
Моя мотивация:
Не полагаться на какие-либо библиотеки, предоставляемые ОС, чтобы иметь идеально воспроизводимую кодовую базу
Избегайте проблем при развертывании на других системах, вызванных динамическим связыванием
Избегайте столкновений во время выполнения при связывании с различными версиями библиотеки
Возможность кросс-компиляции для других ОС
Ваши мотивы все не так.
Для # 1 вам не нужен полностью статический двоичный файл. Вам просто нужно связать с набором контролируемых версиями библиотек, используя --sysroot
средство предоставлено линкерами GNU
Для # 2, ваша мотивация ошибочна.
В Linux полностью статический двоичный файл может таинственным образом зависать, если libc, установленный в целевой системе, отличается от (static) libc, на котором была построена программа. То есть полностью статический двоичный файл в Linux является (вопреки распространенному мнению) значительно Меньше портативный, чем динамически связанный. Надо просто никогда статически ссылка libc.a на Linux.
Одно это должно заставить вас отказаться от этого подхода (по крайней мере, для любых систем на основе GLIBC).
Для # 3, не связывайтесь с разными версиями библиотеки (во время сборки программы), и никаких столкновений не будет.
Для # 4 то же самое решение, что и для # 1, просто работает.
Других решений пока нет …