1.) Является ли библиотека STD общей библиотекой или что это такое?
Понятия не имею. Может быть либо. Вероятно, оба. Это имеет значение? Если вы не имеете дело с чем-то действительно экзотическим, таким как автономный статически связанный двоичный файл для перестройки системы, если компилятор / система знает, как его связать, вы вряд ли будете этим заниматься.
В двух словах, код может быть в статических библиотеках, и в этом случае он связывается с конечным (скомпилированным / сгенерированным) исполняемым файлом, и эти двоичные файлы могут стать довольно большими. Или это может быть в общей библиотеке, в этом случае библиотека загружается динамически, и несколько приложений могут (теоретически) совместно использовать один образ общей памяти. Если вы не делаете что-то достаточно большое и которое будет использоваться несколькими приложениями, я бы поставил под сомнение целесообразность использования совместно используемых библиотек. Дополнительные головные боли, особенно отладочные, редко стоят того. А без одновременного запуска нескольких приложений экономия невозможна ...
Чтобы создать статическую библиотеку, я бы скомпилировал кучу файлов в объектные файлы ... Чем использовать ar и randlib . E.g.:
g++ -c foo1.C -o foo1.o
g++ -c foo2.C -o foo2.o
ar -rv libfoo.a foo1.o foo2.o
ranlib libfoo.a
Впоследствии я просто связал бы эту библиотеку с:
g++ testfoo.C -o testfoo -L. -lfoo
Обратите внимание, что если вы используете несколько библиотек, порядок -lbar1 -lbar2 для этой (g ++ testfoo.C) командной строки важен! Он определяет, какие библиотеки могут вызывать функции / методы в других библиотеках. Круговые зависимости BAD !
Относительно foo1.o foo2.o файлов до ar порядок не имеет значения.
Динамические библиотеки ...
Некоторое время назад, в древней системе fedora core 3, я играл с общими библиотеками под linux. Тогда я собирал свою общую библиотеку, скажем, fooLibrary.c , с:
g++ -shared -Wl,-soname,libfooLibrary.so.1 -o libfooLibrary.so.1.0 -fPIC fooLibrary.c -ldl
В то время я играл с LD_PRELOAD, поэтому у меня был небольшой скрипт для запуска моей программы:
export LD_PRELOAD=libfooLibrary.so ; export LD_LIBRARY_PATH=. ; ./myTestProgram
(Обратите внимание, что я НЕ хочу LD_PRELOAD установить при запуске таких команд, как g ++ , ls , cd и т. д., как я перехватывал системные вызовы.)
(К вашему сведению: strace также интересно играть с ... Вы также должны проверить ldd и 1080 нм * ** * 1081.) * * 1 082
Возможно, вы захотите взглянуть на такие вещи, как dlopen () и dlsym () - для ручного доступа к динамическим библиотекам. ..
Да, и переменная среды LD_LIBRARY_PATH добавляет каталоги в путь поиска по умолчанию для динамических библиотек ...
(Что касается отладки, позвольте мне упомянуть, что когда я перехватил malloc () , я обнаружил, что где-то внутри dlopen () / dlsym () были вызовы * 1104) * malloc () . Это означает, что мне нужно было использовать malloc () , прежде чем я мог вручную загрузить библиотеку, которая предоставляла реальную malloc () . Веселые времена, отлаживающие эту. ..)
PS Еще одна мысль: вы можете просмотреть параметры командной строки для gcc / g ++ . Там много полезной информации ...
http://gcc.gnu.org/onlinedocs/gcc-4.5.1/gcc/index.html#toc_Invoking-GCC