Если вы компилируете библиотеку из 3 исходных файлов C ++ с именами a.cc, b.cc и c.cc соответственно;
g++ -fpic -Wall -c a.cc
g++ -fpic -Wall -c b.cc
g++ -fpic -Wall -c c.cc
g++ -shared -Wl,-soname,libmylib.so.0 -o libmylib.so.0.0.0 a.o b.o c.o
Затем вы устанавливаете библиотеку с помощью ldconfig, см.
man 8 ldconfig
Затем вы можете скомпилировать программу, которая использует библиотеку, следующим образом (, но обязательно указывайте префикс extern "C"
перед объявлениями классов в заголовочных файлах, включенных в исходный код, с использованием библиотеки.)
g ++ -o myprog main.cc -lmylib
Я попробовал эти варианты компиляции с моим собственным примером кода, и все прошло успешно.
В основном То, что описано в Общие библиотеки относится к C ++, просто замените gcc на g ++.
Теория, лежащая в основе всего этого, такова;
Библиотеки загружаются динамически при первой загрузке программы, что можно подтвердить, выполнив трассировку системного вызова в работающей программе, например, strace -o trace.txt ls
, который выведет список системных вызовов, которые программа сделала во время выполнения, в файл с именем trace.txt. В верхней части файла вы увидите, что программа (в данном случае ls
) действительно отобразила все библиотеки в память.
Поскольку библиотеки загружаются динамически, во время компоновки неизвестно, где код библиотеки будет существовать в виртуальном адресном пространстве программы во время выполнения. Поэтому библиотечный код должен быть скомпилирован с использованием кода, независимого от позиции - следовательно, опция -fpic
, которая указывает этапу трансляции генерировать код сборки, который был закодирован с учетом кода, независимого от позиции. Если вы скажете gcc/g++
остановиться после этапа перевода с помощью параметра -S
(в верхнем регистре S), а затем посмотрите на полученный файл '.s', один раз с параметром -fpic
и один раз без, вы получите увидеть разницу (т. е. динамический код имеет @GOTPCREL и @PLT, по крайней мере, для x86_64).
Разумеется, компоновщику необходимо связать все типы перемещаемых объектов ELF с исполняемым кодом, подходящим для использования в качестве разделяемой библиотеки Linux.