Простая общая библиотека - PullRequest
3 голосов
/ 26 октября 2010
  1. Является ли библиотека STD общей библиотекой или что это?из любопытства.
  2. Есть ли какие-нибудь книги, подробно описывающие разработку общих статических библиотек?
  3. Есть ли учебник?

ps (я используюNetBeans, Eclipse, Anjuta) и учебники не полезны, так как я пытаюсь понять, что на самом деле происходит.

Ответы [ 2 ]

7 голосов
/ 26 октября 2010

На моей платформе (Ubuntu Maverick) это:

g++ test.cpp
ldd a.out

linux-vdso.so.1 =>  (0x00007fffee1ff000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f18755fd000)
libm.so.6 => /lib/libm.so.6 (0x00007f187537a000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007f1875163000)
libc.so.6 => /lib/libc.so.6 (0x00007f1874de0000)
/lib64/ld-linux-x86-64.so.2 (0x00007f1875920000)

Обратите внимание на libstdc ++. So.6 выше.

С cmake создать общую библиотеку очень просто.

1. Установите cmake 2.6 или новее.

2. Создайте файл test.cpp с кодом для вашей библиотеки.

3. Создайте файл CMakeLists.txt:

cmake_minimum_required(VERSION 2.6)
project(TEST)
add_library(test SHARED test.cpp)

4. Запустите cmake, чтобы создать make-файл:

cmake -G "Unix Makefiles"

5. Запустите make, чтобы создать свою общую библиотеку.

С помощью CMake вы также можете сгенерировать проект Eclipse CDT, используя следующую команду

cmake -G "Eclipse CDT4 - Unix Makefiles"

Вы также можете найти интересную статью по теме с дальнейшими ссылками здесь .

2 голосов
/ 27 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...