Допустим, у нас есть огромные статические библиотеки с множеством ненужных функций (в приведенном ниже примере у нас есть библиотеки lib1.a
и lib2.a
] с ненужными функциями g1 ()
и f2 ()
).
Мы хотим создать разделяемую библиотеку с несколькими экспортированными методами, которые используют только несколько функций / классов из этих огромных библиотек. См. Пример ниже: мы хотим экспортировать функцию foo ()
.
ВОПРОСЫ
ld
), какие функции / методы мы хотим экспортировать (как мы делаем это для DLL в Windows)? ПРИМЕР
Файл 1.h
:
int f1( int n );
int g1( int n );
Файл 2.h
:
int f2( int n );
Файл foo.cpp
:
#include "1.h"
#include "2.h"
int foo( int n )
{
return f1( n );
}
Файл 1.cpp
:
int f1( int n ) { return n; }
int g1( int n ) { return n; }
Файл 2.cpp
:
int f2( int n ) { return n; }
Файл makefile
:
CXXFLAGS = -g -I. -Wall -Wno-sign-compare
all: prepare libFoo.so
clean:
rm -f obj/*.a obj/*.o res/*.so
prepare:
mkdir -p src
mkdir -p obj
mkdir -p res
lib1.a lib2.a: lib%.a: %.o
ar r obj/$@ obj/$*.o
1.o 2.o foo.o: %.o:
g++ $(CXXFLAGS) -c -o obj/$@ src/$*.cpp
libFoo.so: lib1.a lib2.a foo.o
ld -shared -o res/libFoo.so obj/foo.o -Lobj -l1 -l2
И после создания цели all
у нас есть nm res / libFoo.so
:
...
000001d8 T _Z2f1i
0000020e T _Z2g1i
000001c4 T _Z3fooi
...
Итак, ld
имеет удален объектный файл 2.o
в соответствии с зависимостями между объектными файлами. Но не удалила функцию g1 ()
из 1.o
.