Скажем, у нас есть огромные статические библиотеки с множеством ненужных функций (в приведенном ниже примере есть библиотеки 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
.