Ich hatte große Probleme beim Erstellen gemeinsam genutzter Bibliotheken. Mit zunehmender Größe der Bibliothek werden wir das Innere natürlich in Dateien aufteilen, die API in der Bibliothek definieren und entwickeln.
Zu dieser Zeit habe ich mich immer gefragt, ob es einen Weg gibt.
Wenn Sie es normal machen, wird es so sein. ** Die in der Bibliothek definierte Header-API ist auch in den APIs enthalten, die in der erstellten gemeinsam genutzten Bibliothek verfügbar sind. **
Der öffentliche Header wird angegeben. Wenn Sie jedoch den intern verwendeten Header zwangsweise lesen, wird diese API ebenfalls verwendet. Besonders wenn Sie eine Bibliothek auf Github veröffentlichen, ist es ein bisschen beschissen, unbeabsichtigte APIs verwenden zu können, wie Sie möchten.
Also habe ich es überprüft, ohne es zu erwarten.
Es gibt nichts, was du nicht tun kannst, ja mit GNU! Es scheint also, dass Sie die Veröffentlichung mit vorhandenen Linux-Funktionen einschränken können.
Referenz: http://0xcc.net/blog/archives/000108.html
Angenommen, Sie haben einen öffentlichen Bibliotheksheader wie folgt: (Zuvor erstellte Zeitmessbibliothek)
timetestlog.h
void * timetestlog_init(char *delimiter, size_t maxloglen, unsigned long maxstoresize);
int timetestlog_store_printf(void * handle, const char *format, ...);
void timetestlog_exit(void * handle);
Als Bibliotheksersteller möchte ich, dass Sie nur diese API verwenden.
Angenommen, Sie haben diese API bei der Entwicklung dieser Bibliothek verwendet.
testfile.h
int testfunction(void);
Wenn Sie damit normal kompilieren, können Sie testfunction
verwenden, wenn Sie testfile.h einschließen.
Sie können die veröffentlichte API mit dem Befehl nm -D
oder objdump -t
überprüfen.
Wenn Sie sich das Ergebnis der Befehlsausführung ansehen, sehen Sie, dass die Testfunktion enthalten ist. Außerdem gibt es hier und da zusätzliche APIs
Linux env$ nm -D .libs/libtimelog.so | grep " T "
0000000000000dec T _fini
00000000000007d8 T _init
0000000000000dc0 T testfunction
0000000000000d90 T timetestlog_exit
0000000000000b10 T timetestlog_init
0000000000000c90 T timetestlog_store_printf
Linux env$ objdump -t .libs/libtimelog.so | grep " g"
0000000000000dc0 g F .text 000000000000002c testfunction
0000000000202068 g .data 0000000000000000 _edata
0000000000000dec g F .fini 0000000000000000 _fini
0000000000000c90 g F .text 00000000000000fc timetestlog_store_printf
0000000000000b10 g F .text 000000000000017f timetestlog_init
0000000000202070 g .bss 0000000000000000 _end
0000000000202068 g .bss 0000000000000000 __bss_start
0000000000000d90 g F .text 0000000000000022 timetestlog_exit
00000000000007d8 g F .init 0000000000000000 _init
Verwenden Sie "--version-script", um die öffentliche API einzuschränken. Geben Sie die Konfigurationsdatei (in diesem Fall libtimelog.map) an, die das Versionsskript und die öffentliche API auf diese Weise definiert.
LDFLAGS+=-Wl,--version-script,libtimelog.map
Geben Sie in der Einstellungsdatei die API an, die Sie global verfügbar machen möchten, und geben Sie andere (*) in local an.
libtimelog.map
{
global:
timetestlog_init;
timetestlog_store_printf;
timetestlog_exit;
local: *;
};
Hier ist die öffentliche API der Bibliothek, die durch Angabe der obigen Einstellungsdatei erstellt wurde. Sie können sehen, dass nur die minimale API verfügbar ist.
Linux env$ nm -D .libs/libtimelog.so | grep " T "
0000000000000cb0 T timetestlog_exit
0000000000000a30 T timetestlog_init
0000000000000bb0 T timetestlog_store_printf
Linux env$ objdump -t .libs/libtimelog.so | grep " g"
0000000000000bb0 g F .text 00000000000000fc timetestlog_store_printf
0000000000000a30 g F .text 000000000000017f timetestlog_init
0000000000000cb0 g F .text 0000000000000022 timetestlog_exit
Sie können die öffentliche API mit ** --version-script ** angeben. Bis jetzt war ich besorgt über die zu veröffentlichende API und habe tatsächlich die Dateien zusammengestellt, die ich trennen wollte. Jetzt können Sie ohne zu zögern eine Bibliothek mit Ihrer bevorzugten Dateistruktur erstellen.