Я пытался задать этот вопрос в StackOverflow, но мертвая тишина, которая следовала, заставила меня задаться вопросом, могли ли некоторые более определенные для Ubuntu экспертные знания требоваться.
Я пытаюсь создать статическую версию Python таким образом:
./configure --disable-shared LDFLAGS="-static -static-libgcc" CPPFLAGS="-static"
Однако выполнение make
настроенный как выше в конечном счете блюет некоторые предупреждения и ошибка:
gcc -pthread -static -static-libgcc -Xlinker -export-dynamic -o python \
Modules/python.o \
libpython2.7.a -lpthread -ldl -lutil -lm
<SNIP>
libpython2.7.a(posixmodule.o): In function `posix_initgroups':
Python-2.7.2/./Modules/posixmodule.c:3981: warning: Using 'initgroups' in
statically linked applications requires at runtime the shared
libraries from the glibc version used for linking
/usr/bin/ld: dynamic STT_GNU_IFUNC symbol `strcmp' with pointer equality in
`/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/../../../libc.a(strcmp.o)'
can not be used when making an executable;
recompile with -fPIE and relink with -pie
collect2: ld returned 1 exit status
Я застреваю. Это, кажется, просит, чтобы я перекомпилировал libc. Я думал -static-libgcc
был бы достаточно, но по-видимому это не. Я не знаю, существует ли что-то не так с libc тем, чтобы быть связанным или если существует что-то не так с моими флагами компиляции. Это мешает продолжаться. Кто-либо знает то, что продолжается здесь, и как достигнуть моей цели создания статического Python на Ubuntu 11.04?
Для того, чтобы просто построить двоичный файл python
, после вашего шага (ошибка выше) вы можете вручную запустить
gcc -pthread -static -static-libgcc -o python Modules/python.o libpython3.2m.a -lpthread -ldl -lutil -lm
, разница - -Xlinker -export-dynamic
удаляется.
Но я не тестировал этот двоичный файл для реального использования (просто запустил его, и он запустился).
Ну, если вы хотите использовать реальную статическую сборку, вам придется использовать другую библиотеку Си.
Glibc не справится с задачей, если вы хотите статически связать, вы должны выследить * .a версии всего, что вам может понадобиться во время выполнения, и поместить их во все [ 114] в приложение. Если среда изменится, ваше приложение сломается. Обычно динамические библиотеки позаботятся об этом, поэтому они предпочтительны.
Насколько я знаю, для вас нет решения.