Используйте и статические и динамически подключаемые библиотеки в gcc

К сожалению, так работает SQLite. Из Изоляция в SQLite :

... Но как быть с изменениями, которые происходят во время выполнения оператора SELECT? Что, если оператор SELECT запущен, а интерфейс sqlite3_step () проходит примерно половину своего вывода, тогда некоторые операторы UPDATE выполняются приложением, которое изменяет таблицу, которую читает оператор SELECT, а затем выполняется больше вызовов sqlite3_step () закончить оператор SELECT? Увидят ли последующие шаги оператора SELECT изменения, сделанные UPDATE, или нет? Ответ заключается в том, что это поведение не определено ... И, следовательно, разработчики должны старательно избегать написания приложений, которые делают предположения о том, что произойдет в этих обстоятельствах.

blockquote>

Это означает, что SQLite может обеспечить некоторую изоляцию между различными соединениями с одной и той же базой данных (будьте осторожны, только одна из них должна писать), но вы не должны пытаться изменять базу данных, по крайней мере, таблицы, которые читаются между началом и концом SELECT.

45
задан Steve Hanov 1 May 2009 в 00:56
поделиться

3 ответа

Statically linking against any system library, and especially against libc, on modern UNIX or Linux systems makes the binary significantly less portable. Just don't do it.

Instead, use backward compatibility (binaries linked on an older system continue to run on all newer ones) to your advantage, either by linking your binary on an old system (I use RedHat 6.2, and I have not seen a Linux system where my binary will not run in the last 8 years), or by using something like autopackage (which has been deleted after this answer was written).

To answer your original question:

gcc main.o -Wl,-Bstatic -lfoo -Wl,-Bdynamic

will cause linker to use archive version of libfoo. [It is important to have the trailing -Wl,-Bdynamic precisely so you don't force static libc.]

80
ответ дан 26 November 2019 в 21:13
поделиться

Try passing in the paths to the library files you're linking against on the linker command line (be they .a or .so libraries) and drop -static. That should do the trick.

3
ответ дан 26 November 2019 в 21:13
поделиться

Следует отметить, что в Linux вы можете (безопасно) статически связать библиотеку только в том случае, если ни одна из динамических библиотек от нее не зависит. Это означает, что если вы вообще используете какие-либо динамические библиотеки, вы можете забыть о статической компоновке libc. Просто используйте довольно старую версию для сборки в случае libc; libc на протяжении многих лет поддерживает сильную обратную совместимость с ABI.

5
ответ дан 26 November 2019 в 21:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: