LINUX.ORG.RU

История изменений

Исправление ZenitharChampion, (текущая версия) :

Да нет, не RPM, а компилировать программы с минимальным количеством зависимостей. Вот например я покупаю игру Gish и делаю ldd. Зависимостей мало! Компилирую её из открытого исходного кода - и зависимостей много. Как так?!

А просто когда программа открытая, проблемы не существует. Открытое ПО берётся мейнейнерами дистрибутива, и в тот день, когда они решили выпустить новую версию, берётся новый компилятор, последние версии системных библиотек, и прикладное ПО компилируется с ними, намертво привязываясь к 50 библиотекам точно такой, а не предыдущей/следующей, версии. Поэтому для открытого ПО проблемы не существует, на то оно и открытое.

С закрытым ПО стоит поизвращаться. То libboost и libdb прикрепить к программе статически, а остальное - динамически. Но это опасно уязвимостями в библиотеках, которые в последующих минорных версиях закроют, а в программе они останутся навсегда. То с компилятором GCC 4.1 компилировать вместо 4.7, то с Qt 4.3 вместо 4.9. Или класть с программой libgcc и libstdc++, потому что в GCC 4.7 появилась поддержка новых функций или процессорных инструкций, без которых никак. Или положить все библиотеки в каталог lib32 и lib64, и сделать скрипт запуска вроде:

# Change to game directory
CANONPATH=`readlink -f "$0"`
cd "`dirname "$CANONPATH"`"

if [ ! -e properties ] || [ ! -e res ]
then
	echo "Missing properties/ and res/ directories in `pwd`"
	echo "Your installation is incomplete!"
	exit 1
fi

MACHINE=`uname -m`
if [ "$MACHINE" = x86_64 ]
then
	LIBS=./libs64
	BIN=./WorldOfGoo.bin64
else
	LIBS=./libs32
	BIN=./WorldOfGoo.bin32
fi

# Run the game:
export LD_LIBRARY_PATH=$LIBS:"$LD_LIBRARY_PATH"
$BIN $@

То делать зависимости не жёсткими, а опциональными, используя библиотеки через dlOpen. Программа с небольшим количеством зависимостей, каждая из которых прописана в стандарте LSB 4, а остальные библиотеки лежат в архиве с программой, и на них указывает скрипт запуска - идеальна. Плюс ещё скомпилировать не в GCC 4.8 из GIT, а в GCC 4.1, и положить значок и ярлык запуска в /usr/share - и вряд ли найдётся такой Linux, соотвествующий стандарту LSB, в котором программа не запустится.

Ну вот например Java от Oracle запустится одинаково хорошо и в системе 2005 года, и в системе 2012 года. Можно играть в Minecraft! Adobe Flash, обновившись с 10 до 11 версии, не выдаст:

/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found

А вот Skype 4 теперь требует GCC 4.5, а не 4.3, как Skype 2.1. Зато не привязан намертво к PulseAudio в системе, он использует его только если он есть. dlOpen к libpulse.

Исправление ZenitharChampion, :

Да нет, не RPM, а компилировать программы с минимальным количеством зависимостей. Вот например я покупаю игру Gish и делаю ldd. Зависимостей мало! Компилирую её из открытого исходного кода - и зависимостей много. Как так?!

А просто когда программа открытая, проблемы не существует. Открытое ПО берётся мейнейнерами дистрибутива, и в тот день, когда они решили выпустить новую версию, берётся новый компилятор, последние версии системных библиотек, и прикладное ПО компилируется с ними, намертво привязываясь к 50 библиотекам точно такой, а не предыдущей/следующей, версии. Поэтому для открытого ПО проблемы не существует, на то оно и открытое.

С закрытым ПО стоит поизвращаться. То libboost и libdb прикрепить к программе статически, а остальное - динамически. Но это опасно уязвимостями в библиотеках, которые в последующих минорных версиях закроют, а в программе они останутся навсегда. То с компилятором GCC 4.1 компилировать вместо 4.7, то с Qt 4.3 вместо 4.9. Или класть с программой libgcc и libstdc++, потому что в GCC 4.7 появилась поддержка новых функций или процессорных инструкций, без которых никак. Или положить все библиотеки в каталог lib32 и lib64, и сделать скрипт запуска вроде:

# Change to game directory
CANONPATH=`readlink -f "$0"`
cd "`dirname "$CANONPATH"`"

if [ ! -e properties ] || [ ! -e res ]
then
	echo "Missing properties/ and res/ directories in `pwd`"
	echo "Your installation is incomplete!"
	exit 1
fi

MACHINE=`uname -m`
if [ "$MACHINE" = x86_64 ]
then
	LIBS=./libs64
	BIN=./WorldOfGoo.bin64
else
	LIBS=./libs32
	BIN=./WorldOfGoo.bin32
fi

# Run the game:
export LD_LIBRARY_PATH=$LIBS:"$LD_LIBRARY_PATH"
$BIN $@

То делать зависимости не жёсткими, а опциональными, используя библиотеки через dlOpen. Программа с небольшим количеством зависимостей, каждая из которых прописана в стандарте LSB 4, а остальные библиотеки лежат в архиве с программой, и на них указывает скрипт запуска - идеальна. Плюс ещё скомпилировать не в GCC 4.8 из GIT, а в GCC 4.1, и положить значок и ярлык запуска в /usr/share - и вряд ли найдётся такой Linux, соотвествующий стандарту LSB, в котором программа не запустится.

Ну вот например Java от Oracle запустится одинаково хорошо и в системе 2005 года, и в системе 2012 года. Можно играть в Minecraft! Adobe Flash, обновившись с 10 до 11 версии, не выдаст:

/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found

А вот Skype 4 теперь требует GCC 4.5, а не 4.3, как 2.1. Зато не привязан намертво к PulseAudio в системе, он использует его только если он есть. dlOpen к libpulse.

Исправление ZenitharChampion, :

Да нет, не RPM, а компилировать программы с минимальным количеством зависимостей. Вот например я покупаю игру Gish и делаю ldd. Зависимостей мало! Компилирую её из открытого исходного кода - и зависимостей много. Как так?!

А просто когда программа открытая, проблемы не существует. Открытое ПО берётся мейнейнерами дистрибутива, и в тот день, когда они решили выпустить новую версию, берётся новый компилятор, последние версии системных библиотек, и прикладное ПО компилируется с ними, намертво привязываясь к 50 библиотекам точно такой, а не предыдущей/следующей, версии. Поэтому для открытого ПО проблемы не существует, на то оно и открытое.

С закрытым ПО стоит поизвращаться. То libboost и libdb прикрепить к программе статически, а остальное - динамически. Но это опасно уязвимостями в библиотеках, которые в последующих минорных версиях закроют, а в программе они останутся навсегда. То с компилятором GCC 4.1 компилировать вместо 4.7, то с Qt 4.3 вместо 4.9. Или класть с программой libgcc и libstdc++, потому что в GCC 4.7 появилась поддержка новых функций или процессорных инструкций, без которых никак. Или положить все библиотеки в каталог lib32 и lib64, и сделать скрипт запуска вроде:

# Change to game directory
CANONPATH=`readlink -f "$0"`
cd "`dirname "$CANONPATH"`"

if [ ! -e properties ] || [ ! -e res ]
then
	echo "Missing properties/ and res/ directories in `pwd`"
	echo "Your installation is incomplete!"
	exit 1
fi

MACHINE=`uname -m`
if [ "$MACHINE" = x86_64 ]
then
	LIBS=./libs64
	BIN=./WorldOfGoo.bin64
else
	LIBS=./libs32
	BIN=./WorldOfGoo.bin32
fi

# Run the game:
export LD_LIBRARY_PATH=$LIBS:"$LD_LIBRARY_PATH"
$BIN $@

То делать зависимости не жёсткими, а опциональными, используя библиотеки через dlOpen. Программа с небольшим количеством зависимостей, каждая из которых прописана в стандарте LSB 4, а остальные библиотеки лежат в архиве с программой, и на них указывает скрипт запуска - идеальна. Плюс ещё скомпилировать не в GCC 4.8 из GIT, а в GCC 4.1 и положить значок и ярлык запуска в /usr/share - и вряд ли найдётся такой Linux, соотвествующий стандарту LSB, в котором программа не запустится.

Ну вот например Java от Oracle запустится одинаково хорошо и в системе 2005 года, и в системе 2012 года. Можно играть в Minecraft! Adobe Flash, обновившись с 10 до 11 версии, не выдаст:

/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found

А вот Skype 4 теперь требует GCC 4.5, а не 4.3, как 2.1. Зато не привязан намертво к PulseAudio в системе, он использует его только если он есть. dlOpen к libpulse.

Исправление ZenitharChampion, :

Да нет, не RPM, а компилировать программы с минимальным количеством зависимостей. Вот например я покупаю игру Gish и делаю ldd. Зависимостей мало! Компилирую её из открытого исходного кода - и зависимостей много. Как так?!

А просто когда программа открытая, проблемы не существует. Открытое ПО берётся мейнейнерами дистрибутива, и в тот день, когда они решили выпустить новую версию, берётся новый компилятор, последние версии системных библиотек, и прикладное ПО компилируется с ними, намертво привязываясь к 50 библиотекам точно такой, а не предыдущей/следующей, версии. Поэтому для открытого ПО проблемы не существует, а то оно и открытое.

С закрытым ПО стоит поизвращаться. То libboost и libdb прикрепить к программе статически, а остальное - динамически. Но это опасно уязвимостями в библиотеках, которые в последующих минорных версиях закроют, а в программе они останутся навсегда. То с компилятором GCC 4.1 компилировать вместо 4.7, то с Qt 4.3 вместо 4.9. Или класть с программой libgcc и libstdc++, потому что в GCC 4.7 появилась поддержка новых функций или процессорных инструкций, без которых никак. Или положить все библиотеки в каталог lib32 и lib64, и сделать скрипт запуска вроде:

# Change to game directory
CANONPATH=`readlink -f "$0"`
cd "`dirname "$CANONPATH"`"

if [ ! -e properties ] || [ ! -e res ]
then
	echo "Missing properties/ and res/ directories in `pwd`"
	echo "Your installation is incomplete!"
	exit 1
fi

MACHINE=`uname -m`
if [ "$MACHINE" = x86_64 ]
then
	LIBS=./libs64
	BIN=./WorldOfGoo.bin64
else
	LIBS=./libs32
	BIN=./WorldOfGoo.bin32
fi

# Run the game:
export LD_LIBRARY_PATH=$LIBS:"$LD_LIBRARY_PATH"
$BIN $@

То делать зависимости не жёсткими, а опциональными, используя библиотеки через dlOpen. Программа с небольшим количеством зависимостей, каждая из которых прописана в стандарте LSB 4, а остальные библиотеки лежат в архиве с программой, и на них указывает скрипт запуска - идеальна. Плюс ещё скомпилировать не в GCC 4.8 из GIT, а в GCC 4.1 и положить значок и ярлык запуска в /usr/share - и вряд ли найдётся такой Linux, соотвествующий стандарту LSB, в котором программа не запустится.

Ну вот например Java от Oracle запустится одинаково хорошо и в системе 2005 года, и в системе 2012 года. Можно играть в Minecraft! Adobe Flash, обновившись с 10 до 11 версии, не выдаст:

/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found

А вот Skype 4 теперь требует GCC 4.5, а не 4.3, как 2.1. Зато не привязан намертво к PulseAudio в системе, он использует его только если он есть. dlOpen к libpulse.

Исходная версия ZenitharChampion, :

Да нет, не RPM. 1). Компилировать программы с минимальным количеством зависимостей. Вот например я покупаю игру Gish и делаю ldd. Зависимостей мало! Компилирую её из открытого исходного кода - и зависимостей много. Как так?!

А просто когда программа открытая, проблемы не существует. Открытое ПО берётся мейнейнерами дистрибутива, и в тот день, когда они решили выпустить новую версию, берётся новый компилятор, последние версии системных библиотек, и прикладное ПО компилируется с ними, намертво привязываясь к 50 библиотекам точно такой, а не предыдущей/следующей, версии. Поэтому для открытого ПО проблемы не существует, а то оно и открытое.

С закрытым ПО стоит поизвращаться. То libboost и libdb прикрепить к программе статически, а остальное - динамически. Но это опасно уязвимостями в библиотеках, которые в последующих минорных версиях закроют, а в программе они останутся навсегда. То с компилятором GCC 4.1 компилировать вместо 4.7, то с Qt 4.3 вместо 4.9. Или класть с программой libgcc и libstdc++, потому что в GCC 4.7 появилась поддержка новых функций или процессорных инструкций, без которых никак. Или положить все библиотеки в каталог lib32 и lib64, и сделать скрипт запуска вроде:

# Change to game directory
CANONPATH=`readlink -f "$0"`
cd "`dirname "$CANONPATH"`"

if [ ! -e properties ] || [ ! -e res ]
then
	echo "Missing properties/ and res/ directories in `pwd`"
	echo "Your installation is incomplete!"
	exit 1
fi

MACHINE=`uname -m`
if [ "$MACHINE" = x86_64 ]
then
	LIBS=./libs64
	BIN=./WorldOfGoo.bin64
else
	LIBS=./libs32
	BIN=./WorldOfGoo.bin32
fi

# Run the game:
export LD_LIBRARY_PATH=$LIBS:"$LD_LIBRARY_PATH"
$BIN $@

То делать зависимости не жёсткими, а опциональными, используя библиотеки через dlOpen. Программа с небольшим количеством зависимостей, каждая из которых прописана в стандарте LSB 4, а остальные библиотеки лежат в архиве с программой, и на них указывает скрипт запуска - идеальна. Плюс ещё скомпилировать не в GCC 4.8 из GIT, а в GCC 4.1 и положить значок и ярлык запуска в /usr/share - и вряд ли найдётся такой Linux, соотвествующий стандарту LSB, в котором программа не запустится.

Ну вот например Java от Oracle запустится одинаково хорошо и в системе 2005 года, и в системе 2012 года. Можно играть в Minecraft! Adobe Flash, обновившись с 10 до 11 версии, не выдаст:

/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found

А вот Skype 4 теперь требует GCC 4.5, а не 4.3, как 2.1. Зато не привязан намертво к PulseAudio в системе, он использует его только если он есть. dlOpen к libpulse.